C++ 对引用的深入理解-阿里云开发者社区

开发者社区> maojunxu> 正文

C++ 对引用的深入理解

简介: 观看了唐老师讲解的一节《第5课 - 引用的本质分析》感觉非常不错,有深度不废话,我喜欢~~~ 再此总结下,并且奉上视频下载地址~~~ 360网盘下载地址: https://yunpan.cn/cxXynI6sGbHJs      密码(4b1b) //----------------------------------------------正文----------------------------------------------   在C里并没引用这个语法,而在C++里具有这个语法。
+关注继续查看

观看了唐老师讲解的一节《第5课 - 引用的本质分析》感觉非常不错,有深度不废话,我喜欢~~~

再此总结下,并且奉上视频下载地址~~~

360网盘下载地址: https://yunpan.cn/cxXynI6sGbHJs      密码(4b1b)

//----------------------------------------------正文----------------------------------------------

 

在C里并没引用这个语法,而在C++里具有这个语法。为什么C++要添加引用这个语法?

我的理解就是引用就是对指针的封装!

首先,指针变量有多种种形态:p *p &p;

1)p:  代表指针变量中存放的地址值,这个地址值一般就是某个变量的内存地址。

2)*p: 对应的是,p里存放的内存地址中的值。

3)&p: 存放指针变量的内存地址。

使用指针就意味着随时,形态的转变,如取地址,解引用。有时候理解稍微偏差,忘记取地址或者是解引用,就会出现莫名其妙的问题。

为了简化指针的使用,并且和指针拥有一样的强大功能,引用就出现了。

先看一段程序:

复制代码
int main(int argc, char *argv[])
{    
    
    //普通变量 
    int a0 = 8;
     int b0 = a0;
     b0 = 88;
      cout << a0 << endl;
    
    //指针变量 
    int a1 = 8;
     int* b1 = &a1;
     cout << *b1 << endl;
     *b1 = 88;
      cout << a1 << endl;
      
      //引用 
    int a2 = 8;
     int& b2 = a2;
     b2 = 88;
      cout << a2 << endl;    
    
    return 0;
}
复制代码

 

 

1、b0为普通变量,int b0 = a0;仅仅是简单的赋值,所以改变b0的值无法改变

a0的值,它们关联不同的内存空间。

2、b1为指针变量,int* b1 = &a1;这一句将a1的地址给b1这个指针变量。

3、b2为a2的引用,int& b2 = a2;就表示b2和a2关联上了。从此它们同气连枝不分彼此。引用这段程序和普通变量那段程序相比解决多了一个&而已,但是却达到了指针的效果。省去了指针解引用取地址这样的过程。看上去就给同一块内存空间取了两个名字,这两个名字任意一个都可以对这篇内存进行操作。

知道了引用的好处,再来分析他的原理,之前说过我的理解引用就是对指针的封装,其实在引用的背后,其实就是指针,只是编译器隐藏了这个细节。如何证明呢?

首先新建一个结构体:

struct TRef

{

char& r;

};

然后测试这个结构体的大小:

cout << sizeof(TRef) << endl;

发现大小为4,正好是一个指针的大小!(去掉&测试大小是1).进一步分析就得看汇编

Char& b = a; 反汇编之后变成了两句:

wps33D2.tmp

第一句将a的地址放大eax寄存器,然后将eax的值及a的地址放到了b所在的地址空间,所以b里装的是a的地址值。这就是指针的实现过程!

所以一旦编译器,识别到这个变量是个引用,那么当给这个引用关联一个变量时,编译器自动给被关联的变量取地址,当给引用赋值常量的时候,编译器自动给该变量解引用。

正因为,编译器帮你自动完成了取地址和解引用,你才可以不用作这些容易出错的事情,而且完成指针的工作。

这里补充说明一点:

如果你直接去测试cout << sizeof(char&) << endl;的值大小是1,而不是4.这是因为,如果直接访问引用,编译器就会帮你完成解引用这个过程,那么你检测的就是char而不是指针了。而放到结构体里面   就是为了不去直接操作引用 而得到引用的特性。

作者:宋桓公 
出处:http://www.cnblogs.com/douzi2/ 
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
深入理解C语言中的指向函数的指针和返回指针的函数
#include#include/** 返回指针的函数和指向函数的指针*//** 定义一个函数,返回一个void指针,在C语言中,void指针可以* 指向任何类型*/void *func(){    /*     * 一种很容易犯的错误,将局部变量的地址返回     */    int m;    printf("define as void *func()\n");    return &m;}/** 声明一个指向函数的指针,指向返回类型为void指针的函数*/void *(*pfunc)();/*void (*pfun)();* 声明一个函数,指向一个返回void的函数。
618 0
关于C#引用dll动态链接库文件的注释问题
1、dll动态库文件项目生成属性中要勾选“XML文档文件” 注意:1)、要选中项目,查看项目属性,选中解决方案是找不到的。2)、XML文件的名字不要修改。 2、添加引用时XML文件要与DLL文件在同一个目录下。
956 0
深入理解C++中的RVO
## 前言 考虑存在这样一个类如HeavyObject,其拷贝赋值操作比较耗时,通常你在使用函数返回这个类的一个对象时会习惯使用哪一种方式?或者会根据具体场景选择某一种方式? ```c // style 1 HeavyObject func(Args param); // style ...
976 0
探寻Objective-C引用计数本质
本文涉及到的CPU架构为arm64,其它架构大同小异。 源码来自苹果开源-runtime。 Objective-C中采用引用计数机制来管理内存,在MRC时代,需要我们手动retain和release,在苹果引入ARC后大部分时间我们不用再关心引用计数问题。
923 0
Excel中R1C1引用样式
在Excel处理中,经常需要修改某行某列的值。默认情况下Excel中的列号是字母,每次都要去数,因为对字母的位置不熟悉,特别是又有合并单元格的时候,很容易数错。能不能把列也显示成数字,我坚信Office早就为我们考虑过此问题。
490 0
C++中指针和引用的区别
指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指的对象。 不存在指向空值的引用,但是存在指向空值的指针。
902 0
C++ 对引用的深入理解
观看了唐老师讲解的一节《第5课 - 引用的本质分析》感觉非常不错,有深度不废话,我喜欢~~~ 再此总结下,并且奉上视频下载地址~~~ 360网盘下载地址: https://yunpan.cn/cxXynI6sGbHJs      密码(4b1b) //----------------------------------------------正文----------------------------------------------   在C里并没引用这个语法,而在C++里具有这个语法。
770 0
C++中指针和引用的区别
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。
661 0
+关注
702
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载