- 引用的底层是指针
- 在使用到引用的地方,编译期会自动替换成底层指针的解引用
int main()
{
int a = 10;
int& b = a;
//lea eax,[a]
//mov dword ptr [b],eax
int* p = &a;
//lea eax,[a]
//mov dword ptr [p],eax
b = 20;
//mov eax,dword ptr [b]
//mov dword ptr [eax],14h
*p = 20;
//mov eax,dword ptr [p]
//mov dword ptr [eax],14h
cout << a << endl;
cout << b << endl;
return 0;
}
- 引用为什么必须初始化?
- 因为在使用到引用的地方,编译期会自动替换成底层指针的解引用
- 看上边引用的汇编代码,可以知道b中保存的为a的地址,所以引用的本质就是指针
- 当引用一个不可取地址的量时,使用常引用 ,如下代码
//面试笔试时常问
int fun1()
{
return 10;
}
int main()
{
int& a = fun1();//有问题,引用底层是指针,函数返回值通过寄存器带回,寄存器属于cpu,寄存器不可取地址,改进方法
//const int& a = fun1();//使用常引用,会生成一个临时量,真正引用的是临时量,临时量都有常属性
//const int& f = 10;
return 0;
}