缺省参数
1.全缺省
void TestFunc(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
2.半缺省(部分缺省)
void TestFunc(int a, int b = 10, int c = 20) {
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl; }
注意:
-
必须从右往左缺省,特别要注意不可以去间隔着赋值
-
缺省参数不能在函数声明和定义中同时出现
可以单独在声明出现(建议在声明时使用)
也可单独在定义出现
但是不能同时出现
函数重载
参数的 个数/ 类型 / 顺序 不同
- 类型不同
int Add(int left, int right)
double Add(double left, double right)
- 顺序不同
//顺序不同
f(int a , float b )
f(flaot a, int b )
- 参数个数不同
//数据类型不同
f(int a,int b,int c)
f(int a,int b)
问:缺省值不同,能不能构成重载?
不构成
主要是形参的问题,和缺省没任何关系。
问:一个含有缺省值,一个无缺省值,是否构成重载?
构成
传参的时候是构成重载的,但是不传参的时候存在二义性
引用
引用在语法层面 没有开辟新的空间,只是一个别名而已
只是对原来的空间取原名称 叫做 B
-
引用在定义的时候必须初始化
-
一个变量可以有多个引用
-
引用一旦引用一个实体,再不能引用其他实体(从一而终,是一个人的,永远是他的)
int a = 10; int&b = a; int c =20; b = c;//这里是什么意思? //是b变成c的别名? × //还是把c赋值给b? √
引用有什么作用?
-
1.引用做参数
-
//C的交换 void swap(int* p1,int* p2) { int t = *p1; *p1 = *p2 ; *P2 = t; } int main() { itn x= 0,y =10; swap(&x,&y); return 0; } //C++的互换 void swap(int& rx, int& ry) { int t = rx; rx = ry; ry = t; } int main() { int x = 0, y = 10; swap(x, y); cout << x<<" " << y; return 0; }
语法没问题但是使用有问题的情况
传址、传值、传引用 是构成函数重载的 (语法层面是没有问题的,但是实际应用是有问题的)
但是调用的时候存在歧义,不知道调用哪个(调用不明确)
引用的使用场景
-
引用做参数
-
传引用返回 vs 传值返回
- 传值返回
如果是传值返回的话: 创建一个临时变量,而不是将函数中原变量进行赋值
(原函数已经消失,栈帧还给操作系统) 如果使用原变量是非法的、可能是随机值
那么临时变量存在哪里?
如果比较小的话 4/8bit——>寄存器
如果比较大的话 ——>临时变量放在上一个栈帧(调用他的栈帧中)
-
传引用返回/引用做返回值(引用的意思就是,不会生成新的拷贝返回,而是直接返回引用值)
就像修改指针一样,直接把引用值给修改,达到不需要寄存器、栈帧返回的效果
当前代码的问题:
- 存在非法访问,生成的引用是 对于c的引用,c已经销毁,所以非法
- 如果Add函数栈帧销毁,已经清理空间了,那么对于c的引用就是随机值(清理取决于编译器)
使用场景有哪些?
- 日常引用不建议用引用返回
但是,如果函数返回的时候,出了函数的作用域,如果返回对象还在(没有还给系统)(全局变量、静态量、malloc出来的数组、)则可以使用引用返回(在即引用,不在传值)
如果已经还给系统了,就必须使用传值返回。
传值vs传引用 区别:
-
传值是把c的结果传给一个临时变量,而传引用是传c的别名(但是c已经销毁)
-
值返回每次都需要拷贝,但是传引用不需要拷贝,开销较小
引用的主要作用体现在传参和传返回值:
- 引用传参和传犯规之,有些场景下面,可以提高性能。(大对象/深拷贝对象)
- 引用传参和传返回值,输出型参数和输出型返回值。(有些场景形参的改变可以改变实参)
- (有些场景)改变返回对象
特殊的引用:常引用(const &)
int main()
{
const int a =10;
int &b = a; //权限放大 只读->可写可读
const int &b = a;//权限不变 还是只读
int c = 10;
const int &d c ;//权限缩小,可读可写->可读
return 0;
}