C++中引用的本质

//引用的本质
   
   结论一: 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
   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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值