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而不是指针了。而放到结构体里面   就是为了不去直接操作引用 而得到引用的特性。

目录
相关文章
|
4月前
|
存储 安全 C++
C++中的引用和指针:区别与应用
引用和指针在C++中都有其独特的优势和应用场景。引用更适合简洁、安全的代码,而指针提供了更大的灵活性和动态内存管理的能力。在实际编程中,根据需求选择适当的类型,能够编写出高效、可维护的代码。理解并正确使用这两种类型,是掌握C++编程的关键一步。
55 1
|
5月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
57 2
|
3月前
|
存储 安全 C++
浅析C++的指针与引用
虽然指针和引用在C++中都用于间接数据访问,但它们各自拥有独特的特性和应用场景。选择使用指针还是引用,主要取决于程序的具体需求,如是否需要动态内存管理,是否希望变量可以重新指向其他对象等。理解这二者的区别,将有助于开发高效、安全的C++程序。
25 3
|
3月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
4月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
57 5
|
4月前
|
C++
C++引用
C++引用
|
4月前
|
存储 安全 编译器
【C++入门】—— C++入门 (中)_引用
【C++入门】—— C++入门 (中)_引用
33 5
|
4月前
|
C语言 C++ 编译器
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
【C++语言】冲突-C语言:输入输出、缺省参数、引用、内联函数
|
3月前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。