概要
` 引用的本质分析
技术细节
关于引用:
(1)申明引用的同时必须要初始化
(2)引用变量是目标变量的一个别名,相当于目标变量,只是名字不同
(3)申明一个引用不是定义了新的变量,只是目标变量的一个别名,引用本身不是一种数据类型,因此不占存储单元,系统也不会给引用分配存储单元
(4)对引用求地址,就是对目标变量求地址
(5)在被调函数中交换主调函数的两个值,常用方法传递变量地址,第二种就是传递引用
(6)引用一旦初始化就不可以更改
int i = 10; int &b = i; //现在b就是变量i的别名 int j = 100; b = j; //并没有把b转变为变量j的别名,这里相当于把100赋值给b,又因为b是变量i的别名,也就相当于把100赋值给i`
(7)引用可以作为函数返回值
int &f() { static int i = 10; //静态局部变量,在全局区,静态变量等到整个程序运行结束后才会释放 return i; } main() { int &p = f(); //返回的静态变量要等到整个程序运行结束才释放 cout << p << endl; //10 }
(8)如果函数的返回值是引用,这个函数可以作为左值
int &f() { static int i = 10; return i; } main() { int &p = f(); //函数返回引用给p,此时引用p是变量i的一个别名 f() = 100; //函数返回变量i值,这时变量i又被赋值100,又因为上面p是变量i的别名,等于p被赋值100 cout << p << endl; //100 }
引出引用的本质:
引用的本质是指针常量,地址不可变,值可变
int a = 10; int &b = a; //实际是int * const b = &a; b = 20; //实际是*b = 20
延申:常量引用本质就是常量指针常量
int i = 10; int &p = i; //给引用赋的是变量,如果int &p = 10; 直接赋常量报错 const int &p = 10; //常量引用可以直接赋值,编译器做了一个默认操作,int tmp = 10;然后const int &p = tmp; 而且常量引用值是不可以修改的,因为常量引用本质是常量指针常量,const int * const p = &tmp;
小结
引用的本质是指针常量,地址不可变,值可变