1.基本语法与本质
语法:
类型 &变量2 = 变量1
变量2是变量1的别名,可同时通过变量1和变量2操作同一内存,即变量1所在的内存空间
本质:起小名
2.注意事项
引用必须初始化
引用在初始化后就不能改变了
3.引用作函数参数
常见的函数参数形式一般为
形参(值传递)-不改变原参数值
实参(地址传递)-改变原参数值
对于引用可以认为是简化版的地址传递-会改变原参数值
void swap_yy(int &a , int &b)
{
int temp = a;
a = b;
b = temp;
}
等价于
void swap_dz(int *a,int *b)
{
int *temp = a;
a = b;
b = temp;
}
解释,对于调用swap_yy(a,b)
其参数&a 就是传入a的别名,不过别名和原名一样罢了
所以相当于是对地址的操作,当然原变量也会改变
4.引用作为函数的返回值
注意:
1.不要返回局部变量的引用
由于局部变量存放再栈区,函数运行完毕即释放,但是编译器会保留一次该局部变量的值,实际上已经被释放内存了。因此这样可能会导致返回的是一个不知道指向哪里的地址的值。
int& test01()
{
int a = 10;
return a;
}
int main()
{
int &inf = test01();
count << "ref = " << inf << endl;
count << "ref = " << inf << endl;
}
输出:ref = 10
ref = 4324233523
2.引用作为函数返回值可作为左值
因为返回的是引用相当于是一个变量的别名,当然可以赋值。
int& test02()
{
static a = 10;
return a;
}
void main()
{
int & inf = test02();
cout << "inf = " << inf << endl;
cout << "inf = " << inf << endl;
test02() = 1000;
cout << "inf = " << inf << endl;
cout << "inf = " << inf << endl;
}
输出:
inf = 10
inf = 10
inf = 1000
inf = 1000
5.引用的本质
本质:引用的本质在C++内部实现是一个指针常量
也印证了引用初始化后不能更改
6.常量引用
对于
int a = 10;
int & inf = a;
合法,且可通过inf修改a的值
若
int & inf = 10;
不合法
const int & inf = 10;
等价于编译器自动进行了
int temp = 10;
int & inf = temp;
但中间变量temp是未知的
合法,但inf不能进行修改
此时inf为 引用常量
使用场景:
修饰形参,防止误操作修改了原传入值
void showValue(const int & a)
{
//a = 10;报错,只可读不可修改
cout << a << endl;
}
void main()
{
int a = 10;
showValue(a);
}
此时在showValue函数内操作a不会修改main中a 的值