C++ 常量引用用法
常量引用”其实是“对 const 的引用”的简称。因此不可以通过该引用来修改它所指向的对象的值。
1)指向常量对象时,一定要使用“常量引用”,而不能是一般的引用。
const int ci = 1024;
const int &r1 = ci; // 正确:引用及其对应的对象都是常量
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象
(2)“常量引用”可以指向一个非常量对象,但不允许用过该引用修改非常量对象的值。
“常量引用”仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值:
int i = 42;
int &r1 = i; // 普通引用指向非常量对象 i
const int &r2 = i; // 常量引用也绑定非常量对象 i
r1 = 40; // 正确,r1并非常量引用
r2 = 0; // 错误:r2是一个常量引用结果
i=40
r1=40
r2=40
(3)引用的类型必须和所引用的类型严格匹配,且不能与字面值或者某个表达式的计算结果绑定在一起,但是 “常量引用” 是例外(只要被引用的类型能够转换为常量引用的类型)。
int i = 42;
const int &r1 = i; // 正确:指向非常量对象
const int &r2 = 42; // 正确:r2 是一个常量引用
const int &r3 = r1 * 2; // 正确:r3 是一个常量引用
int &r4 = r1 * 2; // 错误:r4 是一个普通的非常量引用
i = 40;则
r1 = 40;
r3 = 84;
const int temp = 2*r1; // 生成一个临时的整型常量
const int &r3 = temp; // 让 r3 绑定这个临时量
所以
int i = 40;int &r1 = i;const int &r3 = i * 2;std::cout << "r3 = " << r3 << std::endl;r1 = 30;std::cout << "r3 = " << r3 << " i = " << i << std::endl;//测试r3是否改变.
r3 = 80
r3 = 80 i = 30
在这些情况下,“常量引用”实际上是绑定了一个临时量(temporary)对象。也就是说,允许“常量引用”指向一个临时量对象。
(4)在函数参数中,使用常量引用非常重要。因为函数有可能接受临时对象,而且同时需要禁止对所引用对象的一切修改。
5.去掉常量的办法是调用const_cast函数
C++ 常量引用用法相关推荐
- C++ 常量引用用法详解
"常量引用"其实是"对 const 的引用"的简称. 顾名思义,它把它所指向的对象看作是常量(不一定是常量),因此不可以通过该引用来修改它所指向的对象的值. 严 ...
- 非常量引用的初始值必须是左值_C++核心编程--引用
2 引用 2.1 引用的基本使用 作用: 给变量起别名 语法: 数据类型 &别名 = 原名 示例: int main() {int a = 10;int &b = a;cout < ...
- c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用
2. 引用 学习目的:取代C中的指针. 目录 2. 引用 2.1 引用的基本使用方法 2.2 引用注意事项 2.3 引用做函数参数 2.4引用做函数返回值 2.5 引用的本质 2.6 常量引用 相关教 ...
- 非常量引用的初始值必须为左值解决方式
看下面的这个函数与调用,这个时候就会出现非常量引用的初始值必须为左值解决方式的错误 修改方法:函数声明的时候,加一个constPoint3f getWorldPoints(const Point2f& ...
- 为什么尽量使用常量引用
2018-04-14 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 对于的普通形参,拷贝大的类对象或者容器对象比较低效,甚至有的类类型根本不支持拷贝操作. 普通引用 (1)容 ...
- 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
一.数组指针和指针数组 1.数组指针(行指针) 首先要知道数组指针是指向数组的指针.所以数组指针本质是个指针,只不过指向一个数组而已.格式为:T (*ptr)[]. 注意:"[]" ...
- C++_引用_常量引用_函数_函数的默认参数---C++语言工作笔记033
然后我们再来看看,常量引用,什么意思,把引用定义成常量,然后不允许修改常量的值, 这样可以防止一下误操作,比如不小心,把不想修改的内容给修改了. 举例子,常量引用,可以是上面 const int &a ...
- C++中“非常量引用的初始值必须是左值”的处理方法
原文:https://blog.csdn.net/hou09tian/article/details/80565343 1 左值和右值 在C++中,左值可以出现在赋值语句的左边和右边:右值只能出现在赋 ...
- C/C++函数传入常量引用的作用(const int a)
const 与&作用 const常类型作用:形参在子函数中调用时当成一个常量来使用,既无法成为左值,无法修改形参的值. 引用(&)作用:如a=&b,表示a是b的别名,此时a和b ...
- Golang struct 指针引用用法(声明入门篇)
Golang struct 指针引用用法 一.前言 入门篇,只包括声明内容,基础的赋值 和 修改值. 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体. 个人术语: ...
最新文章
- vs2010无法调试JS
- C++获取文件夹下所有文件名
- mySQL初学者一些最常用的命令行
- 对5种主流编程语言的吐槽
- 一个网站的诞生- MagicDict开发总结2 [ACCESS的烦恼]
- 403 forbidden nginx_linux搭建nginx服务
- python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...
- 页面全部按钮变成disabled=true_手机也能制作大片!只需轻松几步就能把照片变成视频。...
- 查看mysql所有命令
- 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
- 【语义分割】Smoothed Dilated Convolutions for Improved Dense Prediction阅读笔记
- Tomcat官网下载对应版本
- ITEXT7 实现 PDF文档的合并与拆分
- Navicat提示Access violation at address ... in module ‘navicat.exe‘.Write of address ...
- 回炉重造 | C语言学习
- CF 1467 B. Hills And Valleys
- 【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)
- 简单的身份证号码,全面填写,可以比较年份、月份、天数(初学者学习可以看看)
- 计算机毕业设计Python+uniapp扫码点餐微信小程序(小程序+源码+LW)
- Android中list常用方法,Android中的常用控件及其基本用法
热门文章
- Qcon2017实录|Service Mesh:下一代微服务
- mysql mmm安装管理详解
- 将hta包装为exe发布
- MKAnnotationView,MKAnnotation与MKMapView结合使用显示坐标点
- python代码如何做成应用程序_如何发布你的Python应用程序
- C#中获取今天是星期几
- bufferedwriter怎么写入tab_电脑越用越卡是怎么回事?教你三招恢复火箭般的速度...
- 中国OpenJDK联盟发行特别版本的想法
- MAC上安装JDK后的所在目录
- CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context/Not a GL2 implementation