目录
一、引用的概念和定义
引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。
类型& 引用别名 = 引用对象;
如下所示:
#include<iostream>
using namespace std;
int main()
{
int a = 0;
// 引⽤:b和c是a的别名
int& b = a;
int& c = a;
// 也可以给别名b取别名,d相当于还是a的别名
int& d = b;
++d;
// 这⾥取地址我们看到是⼀样的
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}
a,b,c,d指向的都是同一块空间.

二、引用的特性
- 引用在定义时必须初始化
- ⼀个变量可以有多个引用
- 引用⼀旦引用⼀个实体,再不能引用其他实体
如下所示:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
// 编译报错:“ra”: 必须初始化引⽤
//int& ra;
int& b = a;
int c = 20;
// 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,
// 这⾥是⼀个赋值
b = c;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
return 0;
}
在上面的代码中,我们让b=c是把b的值改为了20,并没有将b变成c的别名。
三、引用的使用
- 引用在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。
- 引用传参跟指针传参功能是类似的,引用传参相对更方便⼀些。
- 引用和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引用跟其他语言的引用(如Java)是有很⼤的区别的,除了用法,最⼤的点,C++引用定义后不能改变指向,Java的引用可以改变指向。
四、const引用
- 可以引用⼀个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小,但是不能放大。
如下所示:
#include<iostream>
using namespace std;
int main() {
const int a = 10;
/*int& ra = a;*/
const int& ra = a;
return 0;
}
注释的那一行代码编译时跑不过去的,这是因为我给a去一个别名,把权限放大了,变量a加了const修饰,只能读,不能改,给a取了一个别名ra,ra可以改a的值,会发生权限放大。
const引用也可以引用普通对象如下所示:
#include<iostream>
using namespace std;
int main() {
int a = 10;
const int& ra = a;
return 0;
}
我们使用const引用给a取别名,当我们使用ra这个别名时,只能读,不能修改,当我们使用使用a时,可以读也能修改。这里的引用就是对b访问权限的缩小。
- 需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产生临时对象存储中间值,也就是时,rb和rd引用的都是临时对象,而C++规定临时对象具有常性,所以这里就触发了权限放大,必须要用常引用才可以。
-
所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象。类型转换,运算求值,函数传参和函数返回都会产生临时变量,我们给这些临时变量增加引用时,需要const引用。
五、指针和引用的关系
C++中指针和引用就像两个性格迥异的亲兄弟,指针是哥哥,引用是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有自己的特点,互相不可替代。
- 语法概念上引用是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
- 引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
- 应用在初始化时引用⼀个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。
- 引用可以直接访问指向对象,指针需要解引用才是访问指向对象。
- sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
- 指针很容易出现空指针和野指针的问题,引用很少出现,引用适宜起来相对更安全⼀些。

被折叠的 条评论
为什么被折叠?



