码迷,mamicode.com
首页 > 其他好文 > 详细

第5课 引用的本质分析

时间:2018-08-22 00:22:33      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:相对   内存   间接   span   注意   int   include   没有初始化   联想   

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

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

swap函数的实现对比如下:

技术分享图片

 

注意:

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

示例程序如下:

技术分享图片

 

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

 const引用:

技术分享图片

 

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

例:

技术分享图片

 

结论:

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

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

示例程序:

 

 1 #include <stdio.h>
 2 
 3 void Example()
 4 {
 5     printf("Example:\n");
 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\n", a);
16     printf("b = %d\n", b);
17 }
18 
19 void Demo()
20 {
21     printf("Demo:\n");
22     
23     const int& c = 1;
24     int* p = (int*)&c;
25     
26     //c = 5;
27     
28     *p = 5;
29     
30     printf("c = %d\n", c);
31 }
32 
33 int main(int argc, char *argv[])
34 {
35     Example();
36     
37     printf("\n");
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\n", sizeof(char&));
15     printf("sizeof(rc) = %d\n", sizeof(rc));
16     
17     printf("sizeof(TRef) = %d\n", sizeof(TRef));
18     printf("sizeof(ref.r) = %d\n", sizeof(ref.r));
19 
20     return 0;
21 }

执行结果:

技术分享图片

 

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

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

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

技术分享图片

 

第5课 引用的本质分析

标签:相对   内存   间接   span   注意   int   include   没有初始化   联想   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9515093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!