你用对const了吗?C++中const小结

const 修饰普通变量

表示变量的值不能被改变。下面两条语句(第2行和第3行)表示的意思一致。

int a;
const int ca = 42;
//int const ca = 42;
const 修饰指针

指向常量的指针不能改变其指对象的值。第 5 行代码是错误的。

int a = 42;const int * ip = &a;
int const * ipp = &a;
//*ip = 42;

常量指针不能改变其指向,也就意味着它必须要初始化。但是,可以通过常量指针改变其所指对象的值,如第 6 行代码,最终打印结果会是 56

int a = 42;
int b = 25;int * const p = &a;
//p = &b;
*p = 56;
cout << "a: " << a << endl;

常量指针,同时它指向一个常量

const int a = 42;
const int * const p = &a;
const 与引用

临时对象的常引用。第2行代码会报错,不能将double类型引用绑定到int类型变量上。但是,加了const修饰后,就没有问题了。

int a = 42;
//double &f = a;
const double &f = a;

本质上,const引用,引用了一个不可改变的临时变量。编译器把代码处理成了如下形式

	const double temp = a;const double &f = temp;
const 修饰函数参数

如果第1行代码参数中没有const,则会报错,不能将一个非const左值引用类型绑定到一个右值(临时对象)上。故将参数修改为常引用

void foo(const std::string &str)
{cout << str << endl;
}int main()
{foo("abcd");return 0;
}
const 修饰类数据成员

const修饰数据成员,称为常数据成员,可能被普通成员函数和常成员函数来使用,不可以更改。

必须初始化,可以在类中(不推荐),或者初始化列表中(这是在类对象生成之前唯一一次改变const成员的机会了)。

class A
{
public:A(int i):_ci(i){cout << "A(int i)" << endl;}~A(){cout << "~A()" << endl;}void dis(){cout << _ci << endl;}
private://const int _ci = 100;  // 不推荐const int _ci;
};int main()
{A a(42);a.dis();return 0;
}
const 修饰类成员函数
  • const修饰成员函数,承诺在本函数内部不会改变类内的数据成员,因此,也只能调用承诺不会改变成员的其它const成员函数,而不能调用其它非const成员函数。

  • const修饰成员函数,放在声明之后,实现体之前。

  • 23行代码,它只能调用const成员函数,如果函数dis()是没有const修饰的话,第23行代码将会报错。

class A
{
public:A(int i, double d, float f):_ci(i), _cd(d), _fe(f){cout << "A()" << endl;}~A(){cout << "~A()" << endl;}void dis() const{cout << _fe << endl;}void foo() const{//_fe = 4.56;dis();}
private:const int _ci;const double _cd;float _fe;
};int main()
{A a(42, 25, 3.14);a.foo();return 0;
}
const 修饰对象

const修饰对象,保证在对象层面,不会修改数据成员。所以const对象,只能调用const成员函数。

参考资料

Stanley等《C++ Primer e5》
王桂林《C++基础与提高》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 禁止谷歌浏览器自动更新(操作贼简单)

禁止谷歌浏览器自动更新 &#xff08;1&#xff09;修改 "C:\Windows\System32\drivers\etc\hosts 文件&#xff0c;在最后增加 127.0.0.1 update.googleapis.com&#xff08;2&#xff09;保存后&#xff0c;winr 快捷键&#xff0c;输入cmd &#xff0c;打开命令行 &am…

RK3588 rknpu2及rknn-toolkit2使用说明

RKNN模型推理共有四种方式&#xff1a; 第一种是借助RKNN-Toolkit2的功能在模拟NPU上运行RKNN模型并获取推理结果&#xff08;在PC端&#xff09; 第二种是借助RKNN-Toolkit2的功能, 将板子与PC连接&#xff0c;将RKNN模型分发到指定的NPU设备进行推理并获取推理结果&#xff0…

AJAX踩坑指南(知识点补充)

JWT JSON Web Token是目前最为流行的跨域认证解决方案 如何获取&#xff1a;在使用JWT身份验证中&#xff0c;当用户使用其凭据成功登录时&#xff0c;将返回JSON Web Token(令牌&#xff09; Token本质就是一个包含了信息的字符串 如何获取Token:登录成功之后&#xff0c;服务…

Springboot解决跨域问题方案总结(包括Nginx,Gateway网关等)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 前言 解决跨域问题方案 1.Spring Boot 中解决跨域 1.1 通过注解跨域 1.2 通…

什么是RabbitMQ的死信队列

RabbitMQ的死信队列&#xff08;Dead Letter Queue&#xff0c;简称DLQ&#xff09;是一种用于处理消息失败或无法路由的消息的机制。它允许将无法被正常消费的消息重新路由到另一个队列&#xff0c;以便稍后进行进一步处理、分析或排查问题。 当消息对立里面的消息出现以下几…

C语言经典面试题目(二十七)

1、什么是头文件&#xff1f;为什么在C语言中需要使用头文件&#xff1f; 头文件是C语言中的一种文件&#xff0c;通常以.h为文件扩展名&#xff0c;用于存放函数声明、宏定义、结构体声明等。在C语言中&#xff0c;头文件的主要作用是将程序的接口与实现分离开来&#xff0c;…

大数据的实时计算和离线计算你理解吗?

不管是实时计算还是离线计算&#xff0c;都有着同样的业务目标&#xff0c;那就是根据业务要求把数据源计算处理成业务需要的直接可用的数据结果。 如果把数据源比作是水龙头里的水&#xff0c;把数据计算比作是生产纯净水的过程&#xff1b;那么实时计算就是用一根水管接在水龙…

css的text-shadow详解

CSS的text-shadow属性用于为文本添加阴影效果&#xff0c;以增强文本的立体感和印刷品质感。该属性可以接受多个值&#xff0c;每个值通过空格分隔&#xff0c;以定义阴影的各个方面。以下是text-shadow属性的详细介绍&#xff1a; 阴影颜色 (Color): 这是阴影的颜色值。它可以…

深度学习基础之《TensorFlow框架(10)—案例:实现线性回归(2)》

增加其他功能 一、增加变量显示 1、目的&#xff1a;在TensorBoard当中观察模型的参数、损失值等变量值的变化 2、收集变量 不同的变量要用不同的方式收集 &#xff08;1&#xff09;tf.summary.scalar(name, tensor) 收集对于损失函数和准确率等单值变量&#xff0c;name为…

ES6生成器(Generator)

一、function* 概念简介&#xff1a;function* - JavaScript | MDN (mozilla.org) function* 声明创建一个绑定到给定名称的新生成器函数。生成器函数可以退出&#xff0c;并在稍后重新进入&#xff0c;其上下文&#xff08;变量绑定&#xff09;会在重新进入时保存。 1.1 y…

Spring Boot 自动化单元测试类的编写过程

前言 Web环境模拟测试 企业开发不仅要保障业务层与数据层的功能安全有效&#xff0c;也要保障表现层的功能正常。但是我们一般对表现层的测试都是通过postman手工测试的&#xff0c;并没有在打包过程中代码体现表现层功能被测试通过。那么能否在测试用例中对表现层进行功能测…

LabVIEW高效光伏数据监控与管理系统

LabVIEW高效光伏数据监控与管理系统 随着新能源技术的发展&#xff0c;光伏发电系统作为一种清洁、高效的能源获取方式受到了广泛的关注。但是&#xff0c;由于光伏发电的特性受到多种环境因素的影响&#xff0c;其运行效率和安全性成为了关键问题。因此&#xff0c;开发一个高…

K8S--SpringCloud应用整合Nacos实战

原文网址&#xff1a;K8S--SpringCloud应用整合Nacos实战-CSDN博客 简介 本文介绍K8S部署SpringCloud应用整合Nacos实战。 本文是将原来的SpringCloud项目&#xff08;闪速优选&#xff09;迁移到K8S上&#xff0c;一行代码都不需要改动。用K8S运行Nacos、Gateway、SpringCl…

MTU网络大小

MTU是路由器最大传输单元&#xff08;指L3网络层最大帧大小&#xff09;&#xff0c;IP包超过这个MTU大小设定就会走分片流程&#xff0c;MTU最大为1500字节。 对于IPV4最小MTU要求至少68字节&#xff08;IP头占用大小&#xff0c;不包含其它载荷数据&#xff09; 对于IPV6最小…

Mac nvm install failed python: not found

报错 $>./configure --prefix/Users/xxx/.nvm/versions/node/v12.22.12 < ./configure: line 3: exec: python: not found nvm: install v12.22.12 failed!解决方法 到 App 文件夹&#xff0c;并且打开 cd /System/Applications/Utilities/ open .记得改完 Rosetta 之…

模拟-算法

文章目录 替换所有的问号提莫攻击Z字形变换外观数列数青蛙 替换所有的问号 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就遍历 a ~ z 去尝试替换即可。 class Solution {public String modifyString(String s) {char[] ss s.toCharA…

如何进行SQL调优?

前言 SQL调优是面试中经常爱问的问题&#xff0c;这个问题可以考察一个候选人对于SQL的整体性能优化的理解和掌握程度&#xff0c;今天我么你来聊一聊如何继续宁SQL调优。 步骤 一般来说&#xff0c;SQL调优需要从以下几个方面和步骤入手。 首先&#xff0c;需要先发现问题&…

mac下 3.6.3 版本 maven

问题 Blocked mirror for repositories: [snapshots (http://xxx/artifactory/gm-maven-vir, default, releasessnapshots)]无法访问 Maven 3.8.1 http 仓库。可能的解决方案: - 检查 Maven settings.xml 是否不包含 http 仓库 - 检查 Maven pom 文件是否不包含 http 仓库 htt…

bs4的基本使用

下载基本使用标签定位标签属性定位选择器定位数据的提取 下载 pip install bs4 pip install lxml基本使用 from bs4 import BeautifulSoup #1.创建一个BeautifulSoup的工具对象&#xff0c;然后把即将被解析的页面源码数据加载到该对象中#参数1&#xff1a;被解析的页面源码数…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;LED IO初始化函数(LED_Init())&#xff08;3&#xff09;开发板矩阵键盘IO初始化&#xff08;ExpKeyBordInit()&#xff09;&…