引用
引用使用
给变量起个别名:对同一块内存地址的数据同时有两个名称 数据类型 &别名 = 原名
int a = 10;
int &b = a;
b = 20;
cout<<a<<endl;
--------------------
20
图解:
引用的“从一而终”
int &b;
int a = 10,c = 30;
int &b = a;
b = c;
b = 33;
cout<<c<<endl;
cout<<a<<endl;
ps:不要妄图改变b的别名捆绑对象,它忠贞不渝
引用函参
其中地址、引用传递都可以用形参修饰实参,引用比指针更方便。
void swap(int &a, int&b){
int temp = a;
a = b;
b = temp;
}
int main(){
int c = 10,d = 20;
swap(c,d);
cout<<c<<endl<<d<<endl;
}
-----------------------------
20
10
交换成功,a/b分别是c/d的别名,指向的同一片内存空间,因此swap函数内部对a/b操作实质上就是c/d的操作
引用返回值
- 最好不要作为局部变量的引用(类似不要返回局部变量的地址)
因为会在函数执行完毕被释放掉
int& func(){
int a = 20;
return a;
}
int main(){
int &b = func();
cout<<b<<endl;
cout<<b<<endl;
}
可见第一次的输出是编译器做的保留,第二次已经被释放。如若必要可用static修饰,静态变量存放在全局区,待程序运行完毕才会被释放。
int& func(){
static int a = 20;
return a;
}
int main(){
int &b = func();
func() = 33;
cout<<b<<endl;
}
----------------------------
33
func()代表的是a,即b,赋值为33.
引用实质
指针常量 ——不能改变指向,可以改变数值
int a = 2;
int &b = a;
b = 3;
int* const b = &a;
*b = 3;
常量引用——const修饰
防止函数内部对形参改变实现对实参的误操作 ——只读形参
void func(const int &b){
b = 11;
cout<<b<<endl;
}
int main(){
int a = 33;
func(a);
}
|