C++ const reference

news/2025/1/7 21:55:30/

因为这个概念的中文翻译和绕口令一样所以直接用英文代替

  • const reference:引用本身是const的,比如const int &r1 = 1r1就是一个const reference,换句话说r1的值不能被更改(但是我们可以更改r1指向的值,当r1指向的值被更改,那么r1的值也被更改)

引用
引用和指针抛开底层不谈(引用底层也是指针实现的),引用和指针变量的最大区别就是引用绑定了被引用值,当引用发生变化,被引用的值也发生变化,这个在指针变量中是不可能的如下代码

std::string s = "hello world"; 
std::string& s1 = s; //引用s1和变量s绑定
s1 = "123456"; //更改s1
std::cout << s << std::endl;//输出123456,表明通过引用s1改变了被引用值s

想象一下我们传入一个引用到函数中,假如函数对引用做了一些我们未知的操作,那么被引用的值也会发生变化,此时程序就变得不可控,所以为了杜绝这个情况发生,引入了关键字const

const reference

故名思意就是我们引用是const的,换句话说引用的值不能被更改(当然我们可以更改被引用的值达到更改引用值的目的)如下代码

std::string s = "hello world"; 
const std::string& s1 = s;
s1 = "123456"; //error!!! 引用s1是const的我们不能更改引用s1的值

假如将引用s1传入函数中,函数中任何对引用s1赋值更改的操作都是错误的,所以在函数内不可能更改s1,进一步不能更改s1引向的对象的值,我们只能通过在函数外部更改s1引向的对象的值达到更改const reference s1值的目的,当然这个操作在函数外部执行,说明我们已经知晓我们要干什么如果出现错误导致引用s1的函数出现不可知行为说明是我们设计的bug

std::string s = "hello world"; 
const std::string& s1 = s; //将const reference s1指向一个非const的对象
s = "123456"; //更改const reference s1指向的对象s的值
std::cout << s1 << std::endl; //输出123456发现值已经通过s进行更改

综上所述const reference只是约束引用本身,不能通过引用去更改被引用的值

当然const reference也可以指向一个const变量或者右值

const std::string& s1 = "hello world"; //指向右值
const std::string s = "111"; //常量
const std::string& s1 = s; //指向常量

扩展

我们上面讲了引用,这里扩展一下指针,在C语言中有一下几个概念

  • 常量指针:从概念来说这是一个指针,指向一个常量比如const int* i
  • 指针常量:这是指针本身是一个常量比如int * const i

常量指针代码如下

int a = 1;
int b = 2;
const int* i = &a;
*i = 2; // error
i = &b;

我们看错误代码得知不能通过i去改变i指向的内容,有点绕口,因为i指向a这个内存地址,常量指针就是不能通过指针去改a的值,假如i不是常量指针那么就可以通过i去更改a的地址

指针常量代码如下

int a = 1;
int b = 2;int*  const i = &a; //指针常量
i = &b;//error!!!因为i是常量

因为指针i本身是常量所以我们不能更改i的值

总结

指针变量和引用的区别,因为指针变量本身是一个变量,所以改变其值不会改变其指向内存区域的值,而引用可以看成"绑定"当一个引用指向一个内存区域(“绑定”)后,改变这个引用的值会顺带改变引用指向的对象的值,因此const和引用的组合要比const和指针的组合约束要大,导致const和引用的组合就只有const reference


http://www.ppmy.cn/news/98975.html

相关文章

HCIA-MSTP替代技术之链路捆绑(LACP模式)

目录 手工链路聚合的不足&#xff1a; LACP链路聚合的原理 LACP模式&#xff1a; LACPDU&#xff1a; 1&#xff0c;设备优先级&#xff1a; 设备优先级的比较是&#xff1a;先比较优先级大小&#xff0c;0到32768&#xff0c;越小优先级越高&#xff0c;如果优先级相同&a…

Spring(AOP)

aop引入案例 1.0版本 public void saveAdmin(Admin admin){ jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222"); } 1.1版本 public void saveAdmin(Admin admin){ 验证功…

STL好难(3):vector的使用

目录 1.vector的介绍和使用 2.vector的常见构造&#xff1a; 3.vector的遍历方式 &#x1f349;[ ] 下标 &#x1f349;通过迭代器进行访问&#xff1a; &#x1f349;范围for&#xff1a; 4.vector的迭代器 &#x1f349;begin 和 end &#x1f349;rbegin 和 rend …

js实例化一个对象过程

实例化一个对象的过程发生了什么&#xff1f; 新建一个新的空对象 将this指向这个对象 将prototype上的值赋给对象 返回这个对象 上面是答案&#xff0c;我是因为遇到以下的问题发生了新的思考&#xff1a; 实现链式调用myCalculator(121).add(1).minus(2).multi(3).div(…

Java的包:提高代码可维护性和可扩展性的神器

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f354; 一、包名 &#x1f9c6; 二、类的导入 &#x1f958; 三、静态导入 &#x1f958; 四、在包中增加类 &#x1f371; 五、…

R语言实践——使用rWCVP在WCVP中匹配名称

使用rWCVP在WCVP中匹配名称 加载库工作流1. 示例数据&#xff1a;IUCN红色名录2. 将匹配的名称解析为接受名2.1 模糊匹配2.2 多项匹配2.3 将评估与接受的名称相关联 3. 可视化匹配过程4. 得到最终数据集 加载库 世界维管植物名录提供了所有已知维管植物物种的全球共识观点&…

SpringBoot集成ElasticSearch

文章目录 前言一、ElasticSearch本地环境搭建二、SpringBoot整合ElasticSearch1.pom中引入ES依赖2.application.yaml配置elasticsearch3.ElasticSearchClientConnect连接ES客户端工具类4.ElasticSearchResult封装响应结果5.Person实体类6.Person实体类7.ElasticsearchControlle…

const

关键字const用来定义常量&#xff0c;如果一个变量被const修饰&#xff0c;那么它的值就不能再被改变。 const的存在一定有它的合理性&#xff0c;const修饰符有以下的优点&#xff1a; 预编译指令只是对值进行简单的替换&#xff0c;不能进行类型检查可以保护被修饰的东西&…