//引用的本质
结论一: 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
int age = 10;
const double &rAge = age;
age = 30;
cout << "age is" << age << endl
cout << "rAge is" << rAge << endl
相等于
int age = 10;
int temp = age;
const double &rAge = temp;
age = 30;
汇编代码:
mov dword ptr [ebp-0Ch],0Ah // 将10这个值赋值给age所指向的内存地址所对应的内容,ebp-0Ch很明显是age的内存地址
mov eax,dword ptr [ebp-0Ch] // 将age中存储的内容即10取出来,给了寄存器eax
mov dword ptr [ebp-24h],eax // 将寄存器eax中的10给了另外一个局部变量(匿名变量(看不见的变量))即temp,ebp-24h是匿名变量的内存地址
lea ecx, [ebp-24h] // 将匿名变量的值给了ecx,即将10给了ecx
mov dword ptr [ebp-18h], ecx // 将ecx中的10存储到内存中的ebp-18h地址所对应的内存地址所对应的内容,即rAge中,交给引用去指向
mov dword ptr [ebp-0Ch], 1Eh // 将age改掉,那么temp是不会改变的,所以rAage还是10,age值为30
结论二: 当常引用指向了相同类型的数据时,不会产生临时变量,即引用指向了初始化时的那个变量
int age = 10;
const int &rAge = age;
age = 30;
cout << "age is" << age << endl
cout << "rAge is" << rAge << endl
汇编代码为
mov dword ptr [ebp-0Ch],0Ah //将10这个值赋值给了age内存所对应的内容
lea eax,[ebp-0Ch] // 将age的地址值赋给寄存器
mov dword ptr [ebp-18h],eax // 将寄存器的h值赋值给引用rAge,所以引用依然指向的age
mov dword ptr [ebp-0Ch],1Eh // 所以改变age的值,引用rAge也会跟着改变,age = 10,rAge也为10
数组的引用有两种写法
第一种
int array[] = {1,2,3,4};
int &rArray[4] = array; // 表示这是一个rArray的数组,数组中放着4个指向整型数的引用,这个是不对的,不能这么写
int (&rArray)[4] = array; // 定义了一个引用rArray,这个引用是指向4个int类型的数组
rArray[1] = 6;
第二种
int array[] = {1,2,3,4};
int *p = array;
int *(&p1) = array;// 用p1的引用去引用array,加一个引用还是代表int *的意思,p1这个引用指向array,这里会报错,"int *&"类型的引用是非常量限定
也就是int *的引用来引用数组array,既然是引用,就表示可以更改p1 = 100,这样相等于要把100赋值给array,改引用的值就相等于改array,数组名也就是数组地址,数组名是常量,不能更改,只能把引用变为常引用才能指向这个常量
// 一旦右边是常量的话, 左边应该是常引用
int * const &p2 = array; // 不能通过引用去改常量
所以常见的数组引用有两种写法为
int array[] = {10,20,30};
int (&ref1)[3] = array;
int * const &ref2 = array;
C++中引用的本质
最新推荐文章于 2023-10-11 08:52:21 发布