第5课 引用的本质分析

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第5课 引用的本质分析相关的知识,希望对你有一定的参考价值。

引用作为变量别名而存在,因此在一些场合可以代替指针

引用相对于指针来说具有更好的可读性和实用性

swap函数的实现对比如下:

技术分享图片

 

注意:

  函数中的引用形参不需要进行初始化。

示例程序如下:

技术分享图片

 

形参没有初始化,而是在第15行调用的时候对引用形参进行初始化。

 const引用:

技术分享图片

 

当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名。

例:

技术分享图片

 

结论:

  使用常量对const引用初始化后将生成一个只读变量。普通引用不能使用常量值进行初始化,但是const引用可以。

我们不能直接改变const引用的值,但是可以通过取地址的方式间接的改变这块内存的值。

示例程序:

 

 1 #include <stdio.h>
 2 
 3 void Example()
 4 {
 5     printf("Example:
");
 6     
 7     int a = 4;
 8     const int& b = a;
 9     int* p = (int*)&b;
10     
11     //b = 5;
12     
13     *p = 5;
14     
15     printf("a = %d
", a);
16     printf("b = %d
", b);
17 }
18 
19 void Demo()
20 {
21     printf("Demo:
");
22     
23     const int& c = 1;
24     int* p = (int*)&c;
25     
26     //c = 5;
27     
28     *p = 5;
29     
30     printf("c = %d
", c);
31 }
32 
33 int main(int argc, char *argv[])
34 {
35     Example();
36     
37     printf("
");
38     
39     Demo();
40 
41     return 0;
42 }

 

运行结果如下:

技术分享图片

  可以看到Example函数中通过指针p可以改变内存空间的值,最终影响到了a和b的值,其实它们指的是同一块内存空间,在这个函数中我们也可以直接改变a的值。因为a并不是const的。

 引用有自己的存储空间吗?

技术分享图片

 

示例程序如下:

 1 #include <stdio.h>
 2 
 3 struct TRef
 4 {
 5     char& r;
 6 };
 7 
 8 int main(int argc, char *argv[])
 9 { 
10     char c = c;
11     char& rc = c;
12     TRef ref = { c };
13     
14     printf("sizeof(char&) = %d
", sizeof(char&));
15     printf("sizeof(rc) = %d
", sizeof(rc));
16     
17     printf("sizeof(TRef) = %d
", sizeof(TRef));
18     printf("sizeof(ref.r) = %d
", sizeof(ref.r));
19 
20     return 0;
21 }

执行结果:

技术分享图片

 

char&代表char的引用,所以占用一个字节,rc也是char的引用,占用一个字节,ref.r是char的引用,也占用一个字节。

sizeof(TRef)占用四个字节,这让我们联想到了指针。

引用的内部实现:引用在C++中的内部实现是一个指针常量,具体如下。

技术分享图片

 

以上是关于第5课 引用的本质分析的主要内容,如果未能解决你的问题,请参考以下文章

第27课 数组的本质分析

第0-0课 - 引言

第51课 继承对象模型分析——多态的本质分析

数据-第5课-线性表的本质

第5课 - 线性表的本质

第28课 指针和数组分析(上)