C++ 基础 引用
1.引用的本质
int b = 10;
int &a = b;
等效于:
int * const a = &b;
由于 a 是 const声明,所以一旦定义无法修改,所以要在定义时就要赋初值。
实际使用时:
a = 10; ==> *b = 10;
2. 引用于函数结合
(1)引用做函数参数
int func(int &a)
{
...
}
使用时:
int b = 10;
func(b);
为了分析语法,将其转换为指针,编译器在实参给形参赋值时:
int &a = b; ===> int *const a = &b;
实际使用:
a = 10; ===> *b = 10;
所以实现了间接赋值。
(2)引用做函数返回值
int &func()
{
;
return ret;
}
int main(){ int a = func(); // gcc 中,这里出现段错误 int &b = func(); cout << a << endl; cout << b << endl; // gcc 中,这里段错误}
在 VS 中,debug版本和 release版本的输出不同。
所以上面的代码是错误的。
分析原因:
int a = func(); ==>
int &tmp = ret; === > int *const tmp = &ret;
a = tmp; ===> a = *(&ret);
其中 tmp 是 隐藏变量,一般在寄存器中。
由于 函数返回后,局部变量 ret 空间释放,所以对无效空间的访问是未知的。
int &b = func(); ==>
int &tmp = ret; ===> int *const tmp = &ret;
int &b = tmp; ===> int *const b = tmp; ==> int *const b = &ret;
可以看出这里不存在非法地址访问,所以这句不会报错。
cout << b << endl; ===> cout << *(&ret) << endl;
这里是非法地址访问。报错
由于上面的非法地址访问的本质原因是栈空间的释放,所以如果变量的存储类在堆或数据段就不会有错。
3. 引用与指针
(1)引用指针
int &b = c;
int & * a = &b;
上面的表达式是错误的,因为 指针不能指向引用,原因是 C++之父 不希望 引用和指针一样出现多级引用,同理也没有 引用的引用。
(2)指针引用
int *b = &c;
int * & a = b;
这是成立的,相当于:
int * * const a = &b;
4. 引用与 const
(1)使用变量初始化常引用
int a = 10;
const int &b = a;
a = 11;
b = 12; // 错误
通过常引用赋予变量只读属性。
(2)使用字面量初始化常引用
int &a = 10; // 错误,因为字面量没有地址,无法引用
const int &b = 10;
常引用可以引用字面量,当常引用引用字面量时,C++编译器为字面量分配空间,并让常引用符号作为该空间的别名。
C++ 基础 引用的更多相关文章
- java基础-引用数据类型之二维数组(Array)
java基础-引用数据类型之二维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我们学习过了Java的一维数组,所谓的二维数组就是元素是一堆一维数组的数组,换 ...
- java基础-引用数据类型之一维数组(Array)
java基础-引用数据类型之一维数组(Array) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组的定义 1>.为什么需要数组 保存一个数据可以定义一个变量,如果要保 ...
- Java基础-引用数据类型之集合(Collection)
Java基础-引用数据类型之集合(Collection) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么出现集合类 面向对象语言对事物的体现都是以对象的形式,所以为了方便 ...
- C++ 基础中的基础 ---- 引用
C++ 基础中的基础 ---- 引用 引用的概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量.比如: int n ...
- Java 基础 引用数据类型 ArrayList集合
引用数据类型(类) 分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner类, ...
- Java 基础 引用数据类型 和 流程控制
引用数据类型 与定义基本数据类型变量不同,引用数据类型的变量定义及复制有一个相对固定的步骤和格式: 数据类型 变量名 = new 数据类型(); 如:String st = new String(); ...
- css基础 引用方式 标签选择器 优先级 各式布局
今天讲的css基础,了解了css即层叠式表,是美化网页,控制页面的样式. 样式表引进网页的3种方式1内联式,语法例子:<div style="width: 100px;height: ...
- Django基础(一):基础引用
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
- LinuxC/C++基础——引用
1.引用(Reference) 1.1引用的基本语法 引用是C++对C的重要扩充,也存在与其他一些编程语言中,并不是C++的发明.通过引用,C++增加了 另外一种给函数传递地址的途径,这就是按引用传递 ...
随机推荐
- NIM(1) 一排石头的游戏
最近在实习面试过程中,一个朋友遇到了该问题,从简单到复杂的思路如下,希望能给遇到相同问题的朋友一些启发和帮助.(内容来源网络和<编程之美>) 1.问题1 100个苹果 桌上有100个苹果, ...
- GET和POST区别(转)
作者:silence链接:https://www.zhihu.com/question/28586791/answer/153556269来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- Java 中的四种引用
1.强引用(Strong Reference)在 Java 中四种引用中是“最强”的,我们平时通过 new 关键字创建的对象都属于强引用,如下面的代码: Person person = new Per ...
- vue-样式问题
问题: 今天在用vue开发单页面应用的时候,遇到一个问题,在A页面,直接刷新,页面的布局样式之类的是没有问题的,不过在B页面跳转到A页面,那么A页面有一些样式就不是预期的效果. 发现解决问题: 用调试 ...
- APK加固之静态脱壳机编写入门
目录: 0x00APK加固简介与静态脱壳机的编写思路 1.大家都知道Android中的程序反编译比较简单,辛苦开发出一个APK轻易被人反编译了,所以现在就有很多APK加固的第三方平台,比如爱加密和梆梆 ...
- tnagios - query handler
启动日志 [root@bjyh-48-86 nagios]# cat nagios.log [1433471109] Nagios 4.1.0rc1 starting... (PID=5136) [1 ...
- vos对接时业务确认及信息安全责任承诺书
业务确认及信息安全责任承诺书 双方达成一致,******网络科技有限公司向 有限公司提供中国移动网内语音线路接入服务,保证资源长期使用,保证线路资源接通率标 准,合 ...
- 基于FPGA的VGA显示设计(一)
前言 FPGA主要运用于芯片验证.通信.图像处理.显示VGA接口的显示器是最基本的要求了. 原理 首先需要了解 : (1)VGA接口协议:VGA端子_维基百科 .VGA视频传输标准_百度 引脚1 RE ...
- linux命令之awk命令
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linu ...
- 2018.9.3 CEP课程总结
什么是CEP课程? 职业生涯规划课程 蓝桥介绍 立人达人 全人教育 人文 重视人 尊重人 关心人 爱护人 人才 人格 简历的制作 找工作的流程? 1.简历的准备------>投发简历(自己投.老 ...