c++左值引用
1.左值引用是什么
左值引用是一个变量的别名
2.左值引用声明
<类型名> &引用名 = 被引用对象;
必须在声明的时候初始化,一旦初始化,就不可以引用其他变量原因:
int a = 3;
int b = 5;
int &c = a;//引用c指向a,或者说c引用了a
注意下面的语句:
c = b;
将b的值赋给c引用的变量(a)? 还是 引用c指向了b?
出现了二义性,所以,不允许在声明之后修改引用的指向,上面的赋值语句只是将b的值赋给c引用的变量
3.引用和指针
指针本身也是一个变量
int a = 3;
int *pa = &a;
cout << "指针pa的地址:" << &pa << endl;
cout << "变量a的地址:" << &a << endl;
结果它两的地址并不相同,指针本身是一个变量
引用是一个变量的别名
int a = 3;
int &b = a;
cout << "变量a的地址:" << &a << endl;
cout << "引用b的地址:" << &b << endl;
结果它两的地址相同,所以,引用本身就是一个别名,也就是说,给它引用的内存空间起了另一个名字
使用上的差异
指针使用的时候需要间接访问(解引用);而引用在使用的时候,可以直接使用
扫描二维码关注公众号,回复:
5747782 查看本文章
int a = 3;
int *pa = &a;
int &b = a;
a 就是 *pa 就是 b
和指针一样,基类引用也可以指向派生类
4.const引用(也被称为常量引用)
首先,不能通过const引用修改被引用对象的值
和普通引用的区别
普通的引用,初始化的时候必须指向一个左值 左值,就是可以吃现在赋值号左边的变量或者表达式,例如变量名、数组的间接访问array[index]
const引用不同,const引用可以指向一个左值,也可以指向一个非左值;计算这个非左值表达式的值,然后存储在一个新生成的自动变量中,引用则会引用这个自动变量
5.const左值引用指向自动生成临时变量的两种情况
-
类型不匹配
int a = 3; const long &b = a; cout << "变量a的地址:" << &a << endl; cout << "引用b的地址:" << &b << endl;
输出结果显示,地址并不相同,所以,b引用了一个新的变量
-
初始化一个非左值
int a = 3; const int &b = a + 3; cout << "变量a的地址:" << &a << endl; cout << "引用b的地址:" << &b << endl;
输出结果显示,地址并不相同,所以,b引用了一个新的变量
6.const左值引用常用作函数形参的声明
- 形参声明为const,可以接受非const实参
- 形参声明为const,可以接受非左值实参这种情况下,会生成一个新的变量存储这个非左值的值,类似于形参是一个普通变量
这样的机制,使得函数更加灵活