观看了唐老师讲解的一节《第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 = ;
int b0 = a0;
b0 = ;
cout << a0 << endl; //指针变量
int a1 = ;
int* b1 = &a1;
cout << *b1 << endl;
*b1 = ;
cout << a1 << endl; //引用
int a2 = ;
int& b2 = a2;
b2 = ;
cout << a2 << endl; return ;
}

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; 反汇编之后变成了两句:

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

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

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

这里补充说明一点:

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

C++ 对引用的深入理解的更多相关文章

  1. 对于RegExp反向引用的一点理解

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<关于js的Array.prototype.slice.call> 作者主页:myvin 博主QQ:85 ...

  2. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  3. JAVA不可变类与可变类、值传递与引用传递深入理解

    一个由try...catch...finally引出的思考,在前面已经初步了解过不可变与可变.值传递与引用传递,在这里再次深入理解. 1.先看下面一个try..catch..finally的例子: P ...

  4. php中引用&的真正理解-变量引用、函数引用、对象引用

    php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...

  5. python 引用和对象理解

    今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的:最开始的时候是看到这句话的时候没有反应过来.决定具体搞清楚一下python中变量与对象之间的细节.(其实我感觉应该说 引用和对象 ...

  6. python 引用和对象理解(转)

    引用和对象分离 从最开始的变量开始思考: 在python中,如果要使用一个变量,不需要提前进行声明,只需要在用的时候,给这个变量赋值即可 (这个和C语言等静态类型语言不同,和python为动态类型有关 ...

  7. C++:引用的简单理解

    前言:引用是C++一个很重要的特性,最近看了很多有关引用的资料和博客,故在此对引用的相关知识进行总结 一.什么是引用 引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作 ...

  8. std::move的原理与实现,右值引用的深入理解

    这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...

  9. php中赋值和引用真真的理解

    php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...

随机推荐

  1. [Objective-C] id类型和instancetype类型

    前些时间在源码里看到instancetype返回类型,一脸惊异,表示接触iOS不久没见过这东西,但发现跟id功能差不多.故查了一些资料,了解了两者之间的区别,故将资料简单翻译整理了一下,为博客充一个数 ...

  2. eclipse中整合ejb和web工程

    用 Eclipse JEE 版本的话,新建一个 Enterprise Application Project 工程(New --> Java EE --> Enterprise Appli ...

  3. 索引,B+ tree,动态hash表

    数据库课索引部分的学习笔记. 教材: Database System: The Complete Book, Chapter 15 Database System Implementation, Ch ...

  4. Huawei vlan 配置及vlan 间通讯

    Huawei Vlan配置及vlan 间通讯实例 组网需求:汇聚层交换机做为 PC 电脑的网关, PC3直连 SW2 属于 vlan 2,网关为 vlanif 2 接口地址192.168.2.1/24 ...

  5. Django之基于iframe的ajax伪造

    IFRAME是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME).iframe元素会创建包含另外一个文档的内联框架 ajax的理念是不进行浏览器页面刷新的信息获取更新,也就是局部刷新. 那 ...

  6. opensuse编译安装Python3后缺少zlib

    目录 opensuse编译安装Python3后缺少zlib 前言 编译安装 python导入zlib 重新编译python并指定zlib opensuse编译安装Python3后缺少zlib 前言 由 ...

  7. 记录一次mysql使用load into命令导入csv格式数据的过程

    今天从qwiklab实验获取一组数据,大概有5万条,在qwiklab实验室使用的是pgsql数据库,但是今天想把他插入本地的mysql数据库中. 1.首先是查看一下数据内容: 数据中有的是空值,有的是 ...

  8. JSR规范

    JSR是JavaSpecification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人都 ...

  9. SecureCRT Win免安装版本,简单好用

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. 这个简单好用,程序员必备. 下载地址:SecureCRT. ...

  10. Visual Studio内存泄露检測工具

    使用简单介绍     在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...