保险微网站制作,浙江软装公司,怎么做网站后缀识别符号才不会变,东莞市住建局官网查询1.⭐缺省参数
#xff08;1#xff09;缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时#xff0c;如果没有指定实参则采用该形参的缺省值#xff0c;否则使用指定的实参。
void Func(int a 0)
{coutaendl;
}
int…1.⭐缺省参数
1缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。
void Func(int a 0)
{coutaendl;
}
int main()
{Func(); // 没有传参时使用参数的默认值Func(10); // 传参时使用指定的实参return 0;
}
2缺省参数分类
①全缺省参数
void Func(int a 10, int b 20, int c 30)
{couta aendl;coutb bendl;coutc cendl;
}
②半缺省参数
void Func(int a, int b 10, int c 20)
{couta aendl;coutb bendl;coutc cendl;
} 1. 半缺省参数必须从右往左依次来给出不能间隔着给 2. 缺省参数不能在函数声明和定义中同时出现如果生命与定义位置同时出现恰巧两个位置提供的值不同那编译器就无法确定到底该 用那个缺省值。 3. 缺省值必须是常量或者全局变量 4. C语言不支持编译器不支持 2. ⭐函数重载
1函数重载概念
函数重载是函数的一种特殊情况C允许在同一作用域中声明几个功能类似的同名函数这些同名函数的形参列表(参数个数或类型或类型顺序)不同常用来处理实现功能类似数据类型不同的问题。 三种形式 参数类型不同参数个数不同参数类型顺序不同 #includeiostream
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{cout int Add(int left, int right) endl;return left right;
}
double Add(double left, double right)
{cout double Add(double left, double right) endl;return left right;
}// 2、参数个数不同
void f()
{cout f() endl;
}
void f(int a)
{cout f(int a) endl;
}// 3、参数类型顺序不同
void f(int a, char b)
{cout f(int a,char b) endl;
}
void f(char b, int a)
{cout f(char b, int a) endl;
}int main()
{Add(10, 20);Add(10.1, 20.2);f();f(10);f(10, a);f(a, 10);return 0;
}
2为什么C支持函数重载而C语言不支持呢
在C/C中一个程序要运行起来要经历以下几个阶段预处理、编译、汇编、链接 项目通常是由多个头文件和多个源文件构成【当前a.cpp中调用了b.cpp中定义的Add函数时】编译后链接前a.o的目标 文件中没有Add的函数地址因为Add是在b.cpp中定义的所以Add的地址在b.o中。所以链接阶段就是专门处理这种问题链接器看到a.o调用Add但是没有Add的地址就 会到b.o的符号表中找Add的地址然后链接到一起。那么链接时面对Add函数链接接器会使用哪个名字去找呢这里每个编译器都有自己的函数名修饰规则。在linux下采用g编译完成后函数名字的修饰发生改变编译器将函数参数类型信息添加到修改后的名字中。通过这里就理解了C语言没办法支持重载因为同名函数没办法区分。而C是通过函数修饰规则来区分只要参数不同修饰出来的名字就不一样就支持了重载。如果两个函数函数名和参数是一样的返回值不同是不构成重载的因为调用时编译器没办法区分。 3. ⭐引用
1引用概念 引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量共用同一块内存空间。 类型 引用变量名(对象名) 引用实体 注意引用类型必须和引用实体是同种类型的 void TestRef()
{int a 10;int ra a;//定义引用类型printf(%p\n, a);printf(%p\n, ra);
}
2引用特性 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体再不能引用其他实体 void TestRef()
{int a 10;// int ra; // 该条语句编译时会出错int ra a;int rra a;printf(%p %p %p\n, a, ra, rra);
}
3常引用
常引用是指使用 const 关键字修饰的引用。常引用用于指示在函数中不会修改引用所绑定的对象。这样做的好处是可以确保在函数内部不会意外地修改传递给函数的参数同时还能够允许函数接受常量作为参数。
void TestConstRef()
{const int a 10;//int ra a; // 该语句编译时会出错a为常量const int ra a;// int b 10; // 该语句编译时会出错b为常量const int b 10;double d 12.34;//int rd d; // 该语句编译时会出错类型不同const int rd d;
}
4使用场景
①做参数
void Swap(int left, int right)
{int temp left;left right;right temp;
}
②做返回值
int Count()
{static int n 0;n;// ...return n;
}下面代码输出什么结果
注意如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用引用返回如果已经还给系统了则必须使用传值返回。
int Add(int a, int b)
{int c a b;return c;
}
int main()
{int ret Add(1, 2);cout ret is : ret endl;Add(3, 4);cout ret is : ret endl;return 0;
} 5传值、传引用效率比较
以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。
#include time.h
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A a) {}
void main()
{A a; // 创建一个结构体A的实例a// 1.以值作为函数参数的情况size_t begin1 clock(); // 获取执行函数调用前的时间for (size_t i 0; i 10000; i) // 传值调用10000次这种情况每调用一次就会产生一次拷贝TestFunc1(a);size_t end1 clock();// 获取执行函数调用结束的时间// 2.以引用作为函数参数size_t begin2 clock();// 获取执行函数调用前的时间for (size_t i 0; i 10000; i) // 传引用调用10000次这种情况每次调用都直接用的引用TestFunc2(a);size_t end2 clock();// 获取执行函数调用结束的时间// 分别计算两个函数运行结束后的时间cout TestFunc1(A)-time: end1 - begin1 endl;cout TestFunc2(A)-time: end2 - begin2 endl;// 结果// TestFuncl(A) - time:9// TestFunc2(A) - time : 0
}
6引用和指针的区别
语法
引用是别名语法上不开空间指针是地址需要开空间存地址引用必须初始化指针可以初始化也可以不初始化引用不能改变指向指针可以引用相对更安全没有空引用但有空指针容易出现野指针但是不容易出现野引用sizeof、、解引用访问等方面的区别
底层
汇编层面上没有引用都是指针引用在编译后也转换成指针了。