前言
在学习C语言的时候会遇到指针,会有一级指针、二级指针…很容易让人头昏脑胀。在C++里面,引入了引用的概念,会减少对指针的使用。引用相当于给一个变量起了一个别名,比如“高总”指的是小编。
概述
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
类型& 引用变量名(对象名) = 引用实体
#include<iostream> using namespace std; int main() { int a = 10; int& b = a; int& c = a; return 0; }
调试过程中,发现引用变量的地址和引用实体的地址是相同的,也就是说引用实际上就是给一个变量起了一个别名。
注意:引用类型必须和引用实体是同种类型的
引用和C语言中只针的操作其实差不多,我们在反汇编语言中可以看到:
引用特性
1. 引用在定义时必须初始化
int main() { int a = 10; int& ra; //错误语法 return 0; }
在这段代码中,int& ra
没有初始化,编译器会报错
正确代码:
int main() { int a = 10; int& ra = a; return 0; }
- 一个变量可以有多个引用
int main() { int a = 10; int& ra = a; int& rra = a; return 0; }
上述代码中,ra
、rra
都是对变量a
的引用。这是没有问题的,比如小编有不止一个外号。
- 引用一旦引用一个实体,再不能引用其他实体
int main() { int a = 10; int temp = 20; int& ra = a; ra = temp; cout << ra << endl; cout << a << endl; return 0; }
在这段代码中ra
是变量a
的引用,ra=temp
是将temp
的值赋给ra
引用的实体,即a
。
应用场景
做参数
效果:
- 做输出型参数,形参的改变可以影响实参
- 减少拷贝,提高效率
void Swap(int& a,int& b) { int tmp = a; a = b; b = tmp; } int main() { int x = 0, y = 1; Swap(x, y); cout << x << " " << y << endl; return 0; }
上述代码确实实现了交换两个数字的功能
形参a
是对实参x
的引用,和x
表示同一块空间;形参b
是对实参y
的引用,和y
表示的是用一块空间。所以,在函数内交换a
和b
实际上就是在交换x
和y
。
做返回值
以前的传值返回:
int Add(int a, int b) { int sum = a + b; return sum; } int main() { int x = 4; int y = 3; int ans = Add(x, y); cout << ans << endl; return 0; }
这里随着函数栈帧调用的结束,sum
也会销毁。那为什么最后还能打印出最终结果?
对于这种传值返回,会有一个临时变量的生成,这种临时变量是用来存储返回值的,当返回值比较小的时候,这个临时变量就是寄存器。通过反汇编,我们可以看到:把sum
值赋给了寄存器eax
。
以上是在局部变量中
那么以satic
修饰的变量在静态区,此变量虽然不会随着调用函数的栈帧销毁而销毁,但是在传值返回的时候也会创建临时变量。
因此不难看出,传值返回都会生成一个中间变量。
初谈C++:引用-2
https://developer.aliyun.com/article/1433915?spm=a2c6h.13148508.setting.14.1d684f0eDlrRN4