常量引用”其实是“对 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++ 常量引用用法相关推荐

  1. C++ 常量引用用法详解

    "常量引用"其实是"对 const 的引用"的简称. 顾名思义,它把它所指向的对象看作是常量(不一定是常量),因此不可以通过该引用来修改它所指向的对象的值. 严 ...

  2. 非常量引用的初始值必须是左值_C++核心编程--引用

    2 引用 2.1 引用的基本使用 作用: 给变量起别名 语法: 数据类型 &别名 = 原名 示例: int main() {int a = 10;int &b = a;cout < ...

  3. c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用

    2. 引用 学习目的:取代C中的指针. 目录 2. 引用 2.1 引用的基本使用方法 2.2 引用注意事项 2.3 引用做函数参数 2.4引用做函数返回值 2.5 引用的本质 2.6 常量引用 相关教 ...

  4. 非常量引用的初始值必须为左值解决方式

    看下面的这个函数与调用,这个时候就会出现非常量引用的初始值必须为左值解决方式的错误 修改方法:函数声明的时候,加一个constPoint3f getWorldPoints(const Point2f& ...

  5. 为什么尽量使用常量引用

    2018-04-14 创建人:Ruo_Xiao 邮箱:xclsoftware@163.com 对于的普通形参,拷贝大的类对象或者容器对象比较低效,甚至有的类类型根本不支持拷贝操作. 普通引用 (1)容 ...

  6. 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用

    一.数组指针和指针数组 1.数组指针(行指针) 首先要知道数组指针是指向数组的指针.所以数组指针本质是个指针,只不过指向一个数组而已.格式为:T (*ptr)[]. 注意:"[]" ...

  7. C++_引用_常量引用_函数_函数的默认参数---C++语言工作笔记033

    然后我们再来看看,常量引用,什么意思,把引用定义成常量,然后不允许修改常量的值, 这样可以防止一下误操作,比如不小心,把不想修改的内容给修改了. 举例子,常量引用,可以是上面 const int &a ...

  8. C++中“非常量引用的初始值必须是左值”的处理方法

    原文:https://blog.csdn.net/hou09tian/article/details/80565343 1 左值和右值 在C++中,左值可以出现在赋值语句的左边和右边:右值只能出现在赋 ...

  9. C/C++函数传入常量引用的作用(const int a)

    const 与&作用 const常类型作用:形参在子函数中调用时当成一个常量来使用,既无法成为左值,无法修改形参的值. 引用(&)作用:如a=&b,表示a是b的别名,此时a和b ...

  10. Golang struct 指针引用用法(声明入门篇)

    Golang struct 指针引用用法 一.前言 入门篇,只包括声明内容,基础的赋值 和 修改值. 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体. 个人术语: ...

最新文章

  1. vs2010无法调试JS
  2. C++获取文件夹下所有文件名
  3. mySQL初学者一些最常用的命令行
  4. 对5种主流编程语言的吐槽
  5. 一个网站的诞生- MagicDict开发总结2 [ACCESS的烦恼]
  6. 403 forbidden nginx_linux搭建nginx服务
  7. python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...
  8. 页面全部按钮变成disabled=true_手机也能制作大片!只需轻松几步就能把照片变成视频。...
  9. 查看mysql所有命令
  10. 循迹避障智能小车c语言程序,智能循迹避障小车完整程序lpar;亲测好使rpar;
  11. 【语义分割】Smoothed Dilated Convolutions for Improved Dense Prediction阅读笔记
  12. Tomcat官网下载对应版本
  13. ITEXT7 实现 PDF文档的合并与拆分
  14. Navicat提示Access violation at address ... in module ‘navicat.exe‘.Write of address ...
  15. 回炉重造 | C语言学习
  16. CF 1467 B. Hills And Valleys
  17. 【最短路算法】第二弹:一文弄懂Bellman-Ford(贝尔曼福特算法)
  18. 简单的身份证号码,全面填写,可以比较年份、月份、天数(初学者学习可以看看)
  19. 计算机毕业设计Python+uniapp扫码点餐微信小程序(小程序+源码+LW)
  20. Android中list常用方法,Android中的常用控件及其基本用法

热门文章

  1. Qcon2017实录|Service Mesh:下一代微服务
  2. mysql mmm安装管理详解
  3. 将hta包装为exe发布
  4. MKAnnotationView,MKAnnotation与MKMapView结合使用显示坐标点
  5. python代码如何做成应用程序_如何发布你的Python应用程序
  6. C#中获取今天是星期几
  7. bufferedwriter怎么写入tab_电脑越用越卡是怎么回事?教你三招恢复火箭般的速度...
  8. 中国OpenJDK联盟发行特别版本的想法
  9. MAC上安装JDK后的所在目录
  10. CONTEXT_CREATION_ERROR: Renderer: Error creating Canvas3D graphics context/Not a GL2 implementation