C++ 中 const 关键字
C++ 中 const 关键字
2009-02-19
2024-07-23 补充C++11后的做法
在 C++ 中,const 是一个关键字(也称为保留字),它用于指定变量或对象的值在初始化后不能被修改。关键字是编程语言中具有特殊含义的词汇,编译器会识别这些词并对其进行特殊处理。
类型限定符(Type Qualifier)是指在编程语言中用来限定或修饰变量类型的关键字,它们提供额外的信息来约束变量的行为或存储方式。在 C++ 中,常见的类型限定符包括 const、volatile 和 mutable。
在这里主要说 const 。
const 是一个类型限定符,用于声明常量或只读数据。它表示一旦变量被初始化,其值不能被修改。const 关键字可以应用于变量、指针、引用、函数参数、返回值、成员函数和成员变量。用于声明常量或者指定某个变量、对象的成员、函数参数或返回值的某些方面是不可修改的。
使用 const
关键字编写高质量的代码。
常量声明(Constant Declaration)
用 const
定义常量以替代魔法数字(magic numbers),增加代码的可读性。
#include <iostream>const int MAX_SIZE = 100;int main() {int arr[MAX_SIZE]; // 使用常量声明数组大小std::cout << "Array size: " << MAX_SIZE << std::endl;return 0;
}
常量声明是指用 const
关键字声明一个不可变的变量。
#include <iostream>int main() {const int constantValue = 42; // 声明一个常量变量// constantValue = 10; // 错误:不能修改常量变量的值std::cout << "constantValue: " << constantValue << std::endl;return 0;
}
枚举类型的枚举值
枚举类型中的枚举值默认是整数类型,虽然不能直接指定为 const
,但它们在概念上是常量,不可修改。
enum Colors {RED,GREEN,BLUE
};int main() {Colors color = RED;// color = 10; // 错误:不能将整型赋值给枚举类型return 0;
}
只读引用(Read-Only Reference)
使用 const
引用传递参数,避免拷贝,提高函数效率,并防止修改传入的参数。
示例1
#include <iostream>void printVector(const std::vector<int>& vec) {for (const int& elem : vec) {std::cout << elem << " ";}std::cout << std::endl;
}int main() {std::vector<int> vec = {1, 2, 3, 4, 5};printVector(vec); // 通过只读引用传递vectorreturn 0;
}
示例2
#include <iostream>// 使用常量引用作为函数参数
void printValue(const int& value) {// value = 20; // 错误:不能修改通过常量引用传递的值std::cout << "Value: " << value << std::endl;
}int main() {int x = 10;printValue(x);return 0;
}
函数参数(Function Parameters)
函数参数使用 const
修饰以防止函数内部修改传入的参数。
#include <iostream>void processArray(const int* array, const int size) {for (int i = 0; i < size; ++i) {std::cout << array[i] << " ";}std::cout << std::endl;
}int main() {int arr[] = {1, 2, 3, 4, 5};processArray(arr, 5); // 使用const指针传递数组return 0;
}
返回值(Return Value)
使用 const
修饰返回值,确保返回的对象不能被修改,保护数据完整性。
#include <iostream>const std::string& getGreeting() {static const std::string greeting = "Hello, World!";return greeting;
}int main() {const std::string& greet = getGreeting();std::cout << greet << std::endl;// greet = "Hi"; // 错误:不能修改const引用return 0;
}
成员函数限定符(Member Function Qualifier)
类的成员函数使用 const
限定符,确保函数不会修改对象的状态。
#include <iostream>class MyClass {
public:MyClass(int value) : value_(value) {}int getValue() const {return value_;}void printValue() const {std::cout << "Value: " << value_ << std::endl;}private:int value_;
};int main() {MyClass obj(10);obj.printValue(); // 调用const成员函数return 0;
}
成员变量(Member Variable)
类的成员变量使用 const
修饰,确保其在初始化后不会被修改。
#include <iostream>class MyClass {
public:MyClass(int value) : value_(value) {}int getValue() const {return value_;}private:const int value_; // const成员变量
};int main() {MyClass obj(10);std::cout << "Value: " << obj.getValue() << std::endl;return 0;
}
迭代器和指针(Iterators and Pointers)
使用 const
修饰迭代器和指针,确保它们指向的值不会被修改。
#include <iostream>
#include <vector>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};std::vector<int>::const_iterator it;for (it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << " ";// *it = 10; // 错误:不能通过const迭代器修改值}std::cout << std::endl;return 0;
}
常量指针
#include <iostream>int main() {int value = 10;int otherValue = 20;// 常量指针:指针本身是常量,不能指向其他地方int* const ptr = &value;*ptr = 30; // 可以修改指针指向的值// ptr = &otherValue; // 错误:不能修改指针本身// 指向常量的指针:不能通过指针修改指向的值const int* ptrToConst = &value;// *ptrToConst = 40; // 错误:不能修改指针指向的值ptrToConst = &otherValue; // 可以改变指针本身// 指向常量的常量指针:指针本身和指针指向的值都不能修改const int* const constPtrToConst = &value;// *constPtrToConst = 50; // 错误:不能修改指针指向的值// constPtrToConst = &otherValue; // 错误:不能修改指针本身std::cout << "value = " << value << std::endl;return 0;
}
多态和虚函数(Polymorphism and Virtual Functions)
在多态和虚函数中使用 const
修饰,确保基类和派生类接口一致,并且保证对象状态不被修改。
#include <iostream>class Base {
public:virtual void show() const { // const虚函数std::cout << "Base show" << std::endl;}
};class Derived : public Base {
public:void show() const override { // 覆盖const虚函数std::cout << "Derived show" << std::endl;}
};int main() {Base* b = new Derived();b->show(); // 调用派生类的const虚函数delete b;return 0;
}
函数返回类型后缀(Const After Function Return Type)
函数返回类型可以在函数名后面添加 const
,这种用法一般用于操作符重载,确保返回的对象不能被修改。
#include <iostream>class MyClass {
public:MyClass(int value) : value_(value) {}// 返回一个常量对象const MyClass& operator+(const MyClass& other) const {static MyClass result(value_ + other.value_);return result;}int getValue() const {return value_;}private:int value_;
};int main() {MyClass a(10);MyClass b(20);const MyClass& c = a + b; // 确保返回的对象不能被修改std::cout << "Value of c: " << c.getValue() << std::endl;// c.setValue(50); // 错误:不能修改常量对象return 0;
}
constexpr 和 const
constexpr
是 C++11 引入的关键字,表示一个常量表达式。在 constexpr
中,const
是隐含的,因此 constexpr
对象也是常量。
#include <iostream>constexpr int square(int x) {return x * x;
}int main() {constexpr int result = square(10); // 在编译时计算结果std::cout << "Square of 10 is " << result << std::endl;return 0;
}
lambda 表达式捕获列表
在 lambda 表达式的捕获列表中,可以使用 const
来确保捕获的变量不会在 lambda 内部被修改。
#include <iostream>int main() {int value = 10;auto lambda = [value]() mutable {// value = 20; // 错误:不能修改捕获的常量std::cout << "Captured value: " << value << std::endl;};lambda();return 0;
}
引用成员变量中的 const
在类中,成员变量也可以是常量引用,这种情况一般用于引用另一个对象的常量属性。
#include <iostream>class MyClass {
public:MyClass(const int& ref) : ref_(ref) {}int getValue() const {return ref_;}private:const int& ref_; // 常量引用成员变量
};int main() {int value = 42;MyClass obj(value);std::cout << "Value: " << obj.getValue() << std::endl;return 0;
}
mutable 与 const 成员变量
mutable
关键字允许我们在 const
成员函数中修改特定的成员变量。
#include <iostream>class MyClass {
public:MyClass(int value) : value_(value), counter_(0) {}int getValue() const {++counter_; // 可以修改 mutable 成员变量return value_;}int getCounter() const {return counter_;}private:int value_;mutable int counter_; // mutable 成员变量
};int main() {MyClass obj(10);std::cout << "Value: " << obj.getValue() << std::endl;std::cout << "Counter: " << obj.getCounter() << std::endl;return 0;
}
volatile 与 const
volatile
关键字表示一个变量可能在程序的控制之外被修改,比如在多线程环境中。可以同时使用 volatile
和 const
修饰一个变量,表示变量是只读的,但其值可能会被外部因素修改。
#include <iostream>volatile const int* ptr; // 指向 volatile 和 const 的指针int main() {static int value = 42;ptr = &value;std::cout << "Value: " << *ptr << std::endl;return 0;
}
const_cast
const_cast
用于移除 const
限定符,但要谨慎使用,因为这可能导致未定义行为。
#include <iostream>void modifyValue(const int& value) {int& nonConstValue = const_cast<int&>(value);nonConstValue = 20;
}int main() {int x = 10;std::cout << "Before: " << x << std::endl;modifyValue(x);std::cout << "After: " << x << std::endl;return 0;
}
static const 数据成员
类的 static const
数据成员可以存储类级别的常量信息,通常需要在类外部初始化。
#include <iostream>class MyClass {
public:static const int staticValue;
};const int MyClass::staticValue = 42; // 在类外部初始化int main() {std::cout << "Static Value: " << MyClass::staticValue << std::endl;return 0;
}
相关文章:
C++ 中 const 关键字
C 中 const 关键字 2009-02-19 2024-07-23 补充C11后的做法 在 C 中,const 是一个关键字(也称为保留字),它用于指定变量或对象的值在初始化后不能被修改。关键字是编程语言中具有特殊含义的词汇,编译器会识别这些词并…...
客梯自动监测识别摄像机
当今社会,随着城市建设的快速发展,客梯作为现代化建筑不可或缺的一部分,其安全性与效率显得尤为重要。为了提升客梯的安全管理水平,智能监测技术应运而生,尤其是客梯自动监测识别摄像机系统的应用,为乘客和…...
为什么那么多人学习AI绘画?工资香啊!
在当今这个科技日新月异的时代,AI绘画作为数字艺术与人工智能融合的璀璨成果,正吸引着无数人投身其中,而“工资香啊!”无疑是这一热潮背后不可忽视的驱动力之一。 AI绘画的高薪待遇是吸引众多学习者的关键因素。随着市场对AI艺术…...
国产JS库(js-tool-big-box)7月度总结
js-tool-big-box开发已经有3个月了,团队内的小伙伴进行了热烈的讨论,持续做了功能迭代。小伙伴们也做了艰苦卓绝的文档分享,有纯功能分享类的,有带有小故事的,有朋友们利用自己独自网站分发分享的。7月份快要结束了&am…...
c++ 高精度加法(只支持正整数)
再给大家带来一篇高精度,不过这次是高精度加法!话不多说,开整! 声明 与之前那篇文章一样,如果看起来费劲可以结合总代码来看 定义 由于加法进位最多进1位,所以我们的结果ans[]的长度定义为两个加数中最…...
python键盘操作工具:ctypes、pyautogui
这里模拟 Win Ctrl L 组合键 1、ctypes ctypes库,它允许我们直接调用Windows API来模拟键盘输入。 import ctypes import time# 定义所需的常量和结构 LONG ctypes.c_long DWORD ctypes.c_ulong ULONG_PTR ctypes.POINTER(DWORD) WORD ctypes.c_ushortclass…...
计算机网络发展历史
定义和基本概念 计算机网络是由多个计算设备通过通信线路连接起来的集合,这些设备能够互相交换数据、消息和资源。计算机网络的核心功能是实现数据的远程传输和资源共享,它使得地理位置的限制被大大减弱,极大地促进了信息的自由流动和人类社…...
记录安装android studio踩的坑 win7系统
最近在一台新电脑上安装android studio,报了很多错误,也是费了大劲才解决,发出来大家一起避免一些问题,找到解决方法。 安装时一定要先安装jdk,cmd命令行用java -version查当前的版本,没有的话,先安装jdk,g…...
Python图形编程-PyGame快速入门
PyGame快速入门 文章目录 PyGame快速入门1、什么是PyGame2、安装PyGame3、创建PyGame窗口4、处理事件5、绘制对象6、移动对象7、加载和显示图像8、播放声音9、处理用户输入10、碰撞检测11、动画精灵12、管理游戏状态13、Pygame 中的典型主游戏循环1、什么是PyGame Pygame 是一…...
邦芒宝典:8种方法调整职场心态
在职场中拼斗当然要有好的心态,您知道职场心态如何调整吗? 方法1:自我调整 “思想可以使天堂变成地狱,也可以使地狱变成天堂。”你不能样样顺利,但可以事事尽心;你不能左右天气,但可以改变心情;你…...
华为OD2024D卷机试题汇总,含D量50%+,按算法分类刷题,事半功倍
目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…...
Unity UGUI 之 Graphic Raycaster
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 首先手册连接如下: Unity - Manual: Graphic Raycaster 笔记来源于ÿ…...
类和对象——相关的零碎知识
前提提示: 其实C中的类和对象,最重要的是6个默认函数,如有忘记,请移步到:类和对象。本章是对于一些细节知识的补充和拓展。 1. 隐示类型转换 在运算时,运算符左右两边的操作数的类型不同,编译器…...
【hadoop大数据集群 1】
hadoop大数据集群 1 文章目录 hadoop大数据集群 1一、环境配置1.安装虚拟机2.换源3.安装工具4.安装JDK5.安装Hadoop 一、环境配置 折腾了一下午/(ㄒoㄒ)/~~ 1.安装虚拟机 参考视频:https://www.bilibili.com/video/BV18y4y1G7JA?p17&vd_sourcee15e83ac6b22a…...
TQSDRPI开发板教程:实现PL端的UDP回环与GPSDO
本教程将完成一个全面的UDP运行流程与GPSDO测试,从下载项目的源代码开始,通过编译过程,最终将项目部署到目标板卡上运行演示。此外,我们还介绍如何修改板卡的IP地址,以便更好地适应您的网络环境或项目需求。 首先从Gi…...
array.some() ==> 查找数组list中,是否有包含与当前currKey的值不一样的misId
需求: const list [ {misId: e, name: 小白}, {misId: e, name: 小白白}, {misId: r, name: 小王}, {misId: r, name: 小小王} ] let currKey r 查找数组list中,是否有包含与当前currKey的值不一样的misId 解决: 要查找数组lis…...
最简单的typora+gitee+picgo配置图床
typoragiteepicgo图床 你是否因为管理图片而感到头大?是时候了解一下 Typora、Gitee 和 PicGo 这个超级三剑客了,它们可以帮你轻松打造自己的图床,让你的博客图片管理变得简单又有趣。让我们开始这场神奇的图床之旅吧! Typora …...
【黄啊码】GPT的相关名词解释
GPT是一种基于互联网的、可用数据来训练的、文本生成的深度学习模型 GPT的核心技术是变换器(Transformer),这是一种神经网络结构,可以有效地处理序列数据,比如文本、语音、图像等。GPT使用了大量的预训练数据&#…...
git stash 命令详解
git stash 描述 git stash 命令用于将当前工作目录中的未提交更改(包括暂存区和工作区的更改)保存到一个栈中,并恢复工作目录到干净的 HEAD 状态。这样您可以在不提交当前更改的情况下,切换到其他分支或进行其他操作。后续可以通…...
txt格式单词导入有道词典生词本 (java代码方式)
txt格式单词导入有道词典生词本 (java代码方式) 首先要求txt文档里单词的格式,大概需要像这种: 每行是一个单词,格式为:英文单词空格词性单词意思。 注意 导出单词本的名字就是你 txt 文件的名字 我这里是 公共英语三级 单词本 …...
轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)
目录 0 专栏介绍1 数值优化:共轭梯度法2 基于共轭梯度法的轨迹优化2.1 障碍约束函数2.2 曲率约束函数2.3 平滑约束函数 3 算法仿真3.1 ROS C实现3.2 Python实现 0 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的…...
深入浅出WebRTC—ALR
ALR(Application Limited Region)指的是网络传输过程中,由于应用层的限制(而非网络拥塞)导致带宽未被充分利用的情况。在这种情况下,应用层可能因为处理能力、手动配置或其他因素无法充分利用可用带宽&…...
BSV区块链技术现实应用原理解析
BSV区块链以其卓越的可扩展性、坚如磐石的安全性、极低的交易成本等特性,成为满足企业当下需求并为企业未来成功奠基铺路的理想技术。 BSV协会近期发布了一个题为《驾驭数字化转型:在自动化世界中建立信任——区块链在数据保护和交易优化中的角色》的报…...
七大基于比较的排序算法
目录 一、基于比较的排序算法概述 1. 插入排序(Insertion Sort) 2. 选择排序(Selection Sort) 3. 冒泡排序(Bubble Sort) 4. 归并排序(Merge Sort) 5. 快速排序(Qu…...
web前端 React 框架面试200题(四)
面试题 97. React 两种路由模式的区别?hash和history? 参考回答: 1: hash路由 hash模式是通过改变锚点(#)来更新页面URL,并不会触发页面重新加载,我们可以通过window.onhashchange监听到hash的改变,从而处…...
5.Fabric的共识机制
在Fabric中,有以下3中典型共识机制。 Solo共识 solo共识机制只能用于单节点模式,即只能有一个Orderer节点,因此,其共识过程很简单,每接收到一个交易信息,就在共识模块的控制下产生区块并广播给节点存储到账本中。 Solo 模式下的共识只适用于一个Orderer节点,所以可以在…...
【safari】react在safari浏览器中,遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。如何解决
在safari浏览器中,可能会遇到异步时间差的问题,导致状态没有及时更新到state,引起传参错误。 PS:由于useState是一个普通的函数, 定义为() > void;因此此处不能用await/async替代setTimeout,只能用在返…...
京准:GPS北斗卫星授时信号安全隔离防护装置
京准:GPS北斗卫星授时信号安全隔离防护装置 京准:GPS北斗卫星授时信号安全隔离防护装置 1、主要特点 ★信号加固功能: GPS/BDS单系统信号拒止情况下(包含受到GPS L1欺骗干扰、GPS L1压制干扰、BDS B1欺骗干扰、BDS B1压制干扰&…...
解决方案架构师系列 - AWS - Pinpoint
AWS Pinpoint介绍 Amazon Pinpoint 为营销人员和开发人员提供了一款可自定义的工具,助力他们大规模地开展跨渠道、行业和活动的客户通信。 Amazon Pinpoint是一个全面的客户参与平台,旨在帮助营销人员和开发人员大规模地开展跨渠道、行业和活动的客…...
MF173:将多个工作表转换成PDF文件
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…...
广州智能建站模板/代写稿子的平台
正文 二叉树 由 n( n > 0)个有限节点组成一个具有层次关系的集合,看起来就像一个倒挂的树,因此称这样的数据结构为树。 一个节点的子节点个数叫做度,通俗的讲就是树叉的个数。树中最大的度叫做树的度,…...
企业网站的设计公司/搜索排名优化软件
给定一个链表,链表里的每个节点都存在next指针外,还存在一个随机指向其他节点的指针,如何复制一个这样的链表,我觉得这是自己理解最透彻的一个算法,句句代码都有注释,欢迎大家评论不对的地方 /*** 复制复杂…...
公司网站建设技术方案模板/网站seo优化外包顾问
Pandas库pandas 是基于NumPy 的数据分析包,Pandas 的常用数据结构是 Series(一维数据)与 DataFrame(二维数据)import pandas as pd Pandas库之seriesSeries是带标签的一维数组,可存储整数、浮点数、字符串、…...
成都网站建设前十/免费网站安全软件下载
1. TCP连接当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要…...
临沂做网站系统/什么叫优化
官方写的非常抽象,反正我是没看懂,可能还没到能看懂前端的级别自己也是百度的一开始想去实现一个用的是定义表头参数:{field: status, title: 状态, width: 150, templet:#manager_status,align:center}然后js部分:{{# if(d.statu…...
咸宁网站制作公司/漳州seo建站
OpenCV3.4.1OpenCV_contribVS2013配置(精准无错)Opencv3.4.1和Opencv_contrib的下载(要对应的版本)CMake软件的下载(无需安装),编译opencv配置叽叽叽,来填坑辣Opencv3.4.1和Opencv_c…...