C++中引用的本质分析
引用的意义
- 引用作为变量别名而存在,因此在一些场合可以代替指针
- 引用相对于指针来说具有更好的可读性和实用性
- swap函数的实现对比:
void swap(int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
void swap_yinyong(int& a,int& b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int a = 1;
int b = 2;
printf("a = %d,b = %d\n",a,b);
swap(&a,&b);
printf("指针版本:a = %d, b = %d\n",a,b);
swap_yinyong(a,b);
printf("引用版本:a = %d, b = %d\n",a,b);
return 0;
}
特殊的引用:const引用
- 在C++中可以声明const引用
Const Type& name = val;
Const 引用让变量拥有只读属性
int main()
{
int a = 1;
const int& b = a;
int *p = (int*)&b;
//b = 5; 编译报错,显示不能对只读变量赋值
*p = 5; //要想改变只读变量,可以对他的指针进行操作
printf("a = %d\n",a);
return 0;
}
- 当使用常量对const引用进行初始化时,C++编译器会为常量分配空间并将引用名作为这段空间的别名
int main()
{
const int& b = 1;
int *p = (int*)&b;
*p = 5; //要想改变只读变量,可以对他的指针进行操作
printf("a = %d\n",b);
return 0;
}
使用常量对const引用初始化后将生成一个只读变量
引用在C++中的内部实现是一个指针常量
- 因此引用占用的内存空间与指针相同(一般是四个字节)
- 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节
struct Tref
{
char& c;
};
int main()
{
char c = 'c';
char& rc = c;
Tref ref = { c };
printf("sizeof(char&)%d\n",sizeof(char&));
printf("sizeof(rc)%d\n",sizeof(rc));
printf("sizeof(ref.c)%d\n",sizeof(ref.c));
printf("sizeof(Tref)%d\n",sizeof(Tref));
return 0;
}
struct Tref
{
char* before;
char& ref;
char* after;
};
int main()
{
char a = 'a';
char b = 'b';
char c = 'c';
Tref r = {&a,b,&c};
printf("sizeof(r)%d\n",sizeof(r));
printf("sizeof(Tref.before)%d\n",sizeof(r.before));
printf("sizeof(Tref.after)%d\n",sizeof(r.after));
printf("&r.before=%p\n",&r.before);
printf("&r.after= %p\n",&r.after);
return 0;
}
引用的意义
- C++中的引用大多数情况下能够代替指针
- 功能性:可以满足多数需要使用指针的场合
- 安全性:可以避开由于指针操作不当而带来的内存错误
- 操作性:简单易用,又不失功能强大
小结:
- 引用作为变量别名而存在旨在代替指针
- const引用可以使得变量具有只读属性
- 引用的最终本质为为指针
- 引用可以尽可能的避开内存错误
C++中引用的本质分析的更多相关文章
- C++中引用的本质
一般的教材上讲到引用时,都是说"引用是对象的一个别名".我认为这种定义是不清晰的,不利于初学者理解引用.至少我自己曾经被这个定义困扰了一段时间.到底什么是"别名" ...
- C++中引用的本质是什么?
一般的教材上讲到引用时,都是说“引用是对象的一个别名”.我认为这种定义是不清晰的,不利于初学者理解引用.至少我自己曾经被这个定义困扰了一段时间.到底什么是“别名”? 实际上,引用的实质是位于xxxxx ...
- c语言中函数调用的本质从汇编角度分析
今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...
- iOS中引用计数内存管理机制分析
在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...
- flask中路由的本质源码分析
flask中url的本质: 吧url和视图函数封装到一个Rule对象里面去了,并且吧这个对象添加到url_map中 Rule={"url":'/index','method':'i ...
- Android XML中引用自定义内部类view的四个why
今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...
- C++中引用和指针详解
先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...
- C++解析(4):引用的本质
0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...
- C++ 类的多态五(多态的语法本质分析)
//多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...
随机推荐
- simotion连接 V90 1FL6 增量型电机,报警20025 编码器细分设置
V90 1FL6 增量型电机 The configured fine resolution for Gx_XIST1 (Encoder_N.absEncoder.absResolutionMultip ...
- June 24th 2017 Week 25th Saturday
Who is able to be egotistical needs to be strong too. 有本事任性的人,也要有本事坚强. What is egotistical? Is it th ...
- 贝叶斯网络(Bayesian network))简介(PRML第8.1节总结)概率图模型(Graphical models)
转:http://www.cnblogs.com/Dzhouqi/p/3204353.html 部分图为手写,由于本人字很丑,望见谅,只是想把PRML书的一些部分总结出来,给有需要的人看,希望能帮到一 ...
- UVa 10820 - Send a Table(欧拉函数)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- AtCoder Grand Contest
一句话题解 QwQ主要是因为这篇文章写的有点长……有时候要找某一个题可能不是很好找,所以写了这个东西. 具体的题意.题解和代码可以再往下翻._(:з」∠)_ AGC 001 C:枚举中点/中边. D: ...
- 本地测试时修改localhost为自己网站的域名的方法(转载)
做网站的,在本地测试时,所用的地址基本上都是localhost 或者直接用IP地址:127.0.0.1 如果仅仅是用来测试网站内部的程序代码之类的当然没问题,但是如果我们还要测试网站上添加的广告或者统 ...
- 优化器,sgd,adam等
https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于 ...
- Windows 下制作CentOS7安装U盘
本文属于另类的U盘制作方法(更多U盘安装见U盘安装CentOS ),如何安装CentOS,请参考<安装指南> 以下列出了,完整的制作步骤: 1.下载安装镜像 选择一个合适的镜像网站,比如网 ...
- php面试重要知识点,面试题
1.什么是引用变量,用什么符号定义引用变量? 概念:用不同的名称引用同一个变量的内容:用&符号定义. 例如: $a = range(0,100); $b = &$a; $b = ran ...
- [转]JOGL安装
本章介绍了设置环境以使用JOGL使用不同的集成开发环境(IDE),在您的系统上. 安装JOGL 对于JOGL安装,需要有以下系统要求: 系统要求 第一个要求是要在机器上安装Java Developme ...