一,概念
是对已知的变量取别名,并与它引用的对象共用同一块空间。
类型& 引⽤别名 = 引⽤对象;
int a = 0; // 引⽤:b和c是a的别名 int& b = a;
就像在《西游记》中孙悟空(变量)可以叫孙大圣,悟空,猴哥。这里指的全是他一个人(空间)。
但是,不得不🤮一下祖师爷当初设计的与C语言相同符号&,让后续辨析&费了很大劲。
二,引用的特征
•🔪 引⽤在定义时必须初始化
int main() { int a = 10; int& ra; return 0; }
•🔪🔪⼀个变量可以有多个引⽤
int main() { int a = 0; int& b = a; int& c = a; cout << &a << endl; cout << &b << endl; cout << &c << endl; return 0; }
typedef unsigned int uint;
这⾥取地址我们看到是⼀样的
•🔪🔪🔪 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
int main() { int a = 0; int d = 1; int& b = a; int& b = d; return 0; }
三 ,引用的使用
🥤引用传参->减少拷贝提高效率
图一中形参是实参的拷贝有4*1000=4000个字节
🌸图二与图三都是引用传参的方法
辨析图二为传指针占4/8个字节,而图三是别名不另开空间
🥤引用作返回值->改变引用对象的同时改变被引用对象
在我们在实现栈中有top取栈顶元素
❌ ❌ ❌ 中间商 ❌ ❌ ❌ ✅ ✅ ✅ 无中间商 ✅ ✅ ✅
取栈顶元素中为什么会❌ 呐
因为c/c++规定返回值存在临时寄存器(中间商)中,所以被引用对象改变时已经销毁了产生野指针(进栈创建出栈就销毁)通俗->(进函数创建出函数就销毁)-
那传引用为什么✅那
返回的栈是在堆中建立的所以没有了野指针且返回的是别名无临时变量(中间商)
拓展
💩(辨析)#define与typedef与引用的不同
#define N 10;
定义宏(#define)的常亮,N替换成宏用符号代替常量 好处:是预处理阶段将N换成10.
typedef unsinged int uint;
typedef :给类型取别名
🪡引用的底层逻辑
这是对引用和指针的汇编代码
发现划横线的地方相同---->>>引用的底层是指针