C++ const总结

news/2025/11/13 21:25:28/文章来源:https://www.cnblogs.com/lely/p/19219595

1、const 修饰普通变量

C/C++中常量用于记录程序中不可更改的数据,在数据类型前加const,就得到了一个不可更改的常量。

  • 常量声明const用于定义常量
const int MAX = 100;//MAX的值在程序运行期间无法被修改,所以必须在定义时初始化。

2、const与指针的组合

如果被const修饰的数据类型是指针,要关心下const的位置,const在*左边,表示指向的数据是常量;const在*右边,表示指针本身是常量。口诀:左定值,右定向

  • 常量指针:这种指针不能修改它所指向的内存中的值,但可以改变指针指向其他地址。可以用于函数参数,避免函数修改传入的数据。
int a = 10;
int b = 20;
const int *ptr = &a; // 非常量指针转换为指向常量的指针(转换规则)
int const *ptrr; // 等价上面
// *ptr = 20;  // 错误,不能修改x的值
ptr = &b; // ok
// int* p = ptr; // 错误,指向常量的指针不能隐式转换为非常量指针,需要const_cast
int* pp = const_cast<int*>(ptr); // ok,但使用需谨慎,
// const_cast只能去除指针或引用的const属性,不能去除对象本身的const属性
  • 指针常量:指针本身是常量,必须初始化,不能改变指针的指向,但指向的值可变。用于需要固定指向某个对象,但可能需要修改该对象内容的情况。
int a = 10;
int b = 20;
int* const ptr = &a;  // ptr是一个常指针,不能改变ptr指向的地址
*ptr = 50; // ok
// ptr = &b;  // 错误,ptr不能指向其他变量
  • 完全常量指针:指向常量的常量指针,指针本身是常量,指针指向的数据也是常量。指针和值都不可变,是最严格的const指针。可以用于配置参数、固定常量等绝对不能修改的情况。
int x = 10;
const int* const ptr = &x;
//ptr = &y; // 错
//*ptr = 20; // 错
  • 多层指针与const:指向上述指针的指针
const int** pp1;
int* const* pp2;
int const** pp3;
const int* const* pp4;

3、const与引用

  • 常量引用:引用一个常量,不能通过引用修改数据。可以用于函数参数和返回值,避免拷贝,同时保证不修改原数据,且同时支持常量和变量参数。
int a = 10;
const int& ref = a;
// ref = 20; //错
double d = 3.14;
//int& rj = d; // 错误
const int& ri = d; //ok,创建临时int变量3,绑定ri到临时变量(转换规则)
  • 绑定字面量:只有常量引用可以绑定字面量
const int& a = 10; // 可以用右值(字面量)或同类型的对象初始化(初始化规则)
const double& b = 5; // 可以用不同但相关的对象初始化,会创建临时对象
const int& c = 5.5; // double隐式转换int会丢失精度

4、const在类中的应用

  • 常量成员变量:const成员变量必须在构造函数的初始化列表中初始化,不能在构造函数体内赋值
class Myclass{
private:const int m_v;
public:Myclass(int value):m_v(value){}// ok// 错误//Myclass(int value){//    m_v = value;//}
};
  • const成员函数:1、const成员函数不会修改类的非mutable成员变量,这是一种接口契约。2、const成员函数在编译时会将'this'指针转换为‘const T*'类型,因此不能修改成员变量。3、C++允许const和非const版本的成员函数重载,编译器会根据对象是否为const来选择调用哪个版本。4、const对象只能调用const成员函数,不能调用非const成员函数,非const对象可以调用const和非const成员函数。5、const对象的非mutable成员变量被视为const,可以通过const成员函数获取成员变量的值。
// 对于非const成员函数,this的类型是 T*
// 对于const成员函数,this的类型是 const T*
class StringBuffer{
private:int m_count;string m_buffer;mutable int m_accessCount;
public:const char& operator[](size_t index) const{//m_count++; // 错m_accessCount++; // okcout << "const char&" << endl;return m_buffer[index];}char& operator[](size_t index){cout << "char&" << endl;return m_buffer[index];}int getCount() {return m_count;}int constGetCount() const {return m_count;}
};
int main(){StringBuffer buffer;const StringBuffer constBuffer;buffer[0] = 'A'; // char& 调用非const版本//constBuffer[0] = 'B'; // 错误,const版本返回const引用,不能修改char c1 = buffer[0]; // char& 调用非const版本char c2 = constBuffer[0];// const char& 调用const版本int count = constBuffer.constGetCount(); // ok// count = constBuffer.getCount(); // 错count = buffer.constGetCount(); //okcount = buffer.getCount(); //ok
}

类的设计原则:

对于不修改成员变量的函数,声明为const,提供const和非const重载版本,以支持不同使用场景。合理使用const来约束接口,提高代码的安全性。

实现高效的接口:

返回成员变量的const引用,避免拷贝,允许只读访问,同时保护内部数据。

5、const在实际开发中的最佳实践详解

  • 优先使用const的原则:尽早const,尽可能const,对于不需要修改的数据,从设计初期就声明为const
const double PI = 3.1415926535;
const std::string COMPANY_NAME = "TechCorp";
  • 函数参数的最佳实践:对于内置类型:对于简单类型(int,double等),直接传值即可。对于指针,根据是否需要修改指针指向的数据决定是否使用const;对于自定义类型和容器
void processValue(int value){}
void printValue(const int* valuePtr){}
。。。

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

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

相关文章

11.13 程序员的修炼之道:从小工到专家 第五章 弯曲或折断 - GENGAR

这五节内容围绕软件设计的解耦、灵活性、协作效率展开,提出了多项关键原则与模型。解耦是贯穿始终的核心,得墨忒耳法则明确了对象方法调用的边界,仅允许调用自身、参数、创建对象及直接持有组件的方法,减少模块间依…

20251112周三日记

20251112周三日记今日: 1.早上九点多起床,下去登一下ow卡死进不去了。上课时接到家里消息。准备交简历、连梯子看3b1b教程。 2.下午看完了deepia老师的diffusion介绍,下载了本书,学了会儿,太他妈复杂了全是数学推…

力扣 第 475 场周赛(A~C)

力扣 第 475 场周赛(A~C)$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");A:3740. 三个相等元素之间的最小距离 I见B。 B:3741. 三个相等元素之间的最小距离…

学习笔记:AC 自动机

最智慧的,不是避免所有失败,而是在失配时借力转向,让每一次跌倒都成为新模式的起点。—— 题记其实我两周前就学了 AC 自动机,本来不应该现在才写这个笔记的。但是当时对 AC 自动机的理解比较模糊,直到刚才听了风…

详细介绍:Web爬虫指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

搜维尔科技:具身人工智能中的 MANUS:从人类运动到机器人灵巧性

灵巧的机器人手正成为具身人工智能的基石。动作捕捉、仿真、强化学习和自监督基础模型的最新进展,使得机器人能够执行越来越接近人类的操作技能。 复制人手的精确性、适应性和触觉控制能力(人手由27块骨头、数十块肌…

重组蛋白技术基础概述

重组蛋白的基本概念 重组蛋白是通过基因重组技术在宿主系统中表达的外源蛋白。该技术将目标基因导入表达载体,转化至宿主细胞,利用细胞自身的转录翻译机制合成目标蛋白。与传统组织提取相比,重组技术可获得更高纯度…

升鲜宝分拣系统 具体实现(一)

升鲜宝分拣系统 具体实现(一)按商品分拣1.商品汇总(分页)2.客户汇总(分页)3.分拣一条商品4.撤消一条已分拣商品5.缺货一条订单商品记录6.一条订单商品记录的操作记录7.获取分拣的商品分类8.获取分拣的线路列表9.分…

2025-11-13

1.Problem - 1881E - Codeforces(1500)(dp) dp好题 #include <bits/stdc++.h> using namespace std; #define LL long long const LL mod = 998244353; const int N=2e5+10; int a[N], inf = 1e9, dp[N];voi…

字典树小记

普通字典树 没什么好讲的 0-1 Trie 非常有用,经常用于异或相关的题目 求一个集合中两两异或的最大值 枚举集合中的一个数 \(x\),按位贪心,如果这一位有一个与 \(x\) 不同的,那么字典树上走这一边,否则走 \(x\) 的…

搜维尔科技:Xsens Link为精准而生,为创意而设计,为动作捕捉性能树立了新的标准

行业领先的动作捕捉服 新一代Xsens Link专为追求精准、可靠和行动自由的专业人士打造,这款全新的eSuit配备17个一键式传感器,内置线缆,安装时间缩短50%。Link经过重新设计,可提供最精准、最稳定的运动数据,树立了…

一个好题2

一个好题的题解题目传送门 欢迎光临我的博客 遇到这种题,我们首先有一个套路:拆贡献。我们把答案拆到每条边上,这样的话只需要加上 每条边在所有合法方案里出现的次数之和 \(\times\) 这条边的长度即可。 那一条边会…

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代

实用指南:百分点科技发布中国首个AI原生GEO产品Generforce,助力品牌决胜AI搜索新时代pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important;…

考前复习

Floyd 字符串哈希 单调栈/单调队列 三分 ST 表 最小生成树 最近公共祖先(LCA) dij SPFA 缩点 tarjan(割点,割边,点双,边双,判环 ) 线段树,树状数组 欧拉路径 矩阵快速幂 全源最短路(Johnson) 两个排列的最长公…

2025 年 11 月粮库空调厂家最新推荐,聚焦资质、案例、售后的实力品牌深度解析!

在粮食储备行业,粮库空调的性能直接关系到粮食品质与存储安全,随着全球粮食储备技术升级,市场对高精度、高稳定性粮库空调的需求持续增长。本次 2025 年 11 月粮库空调厂家推荐,参考国际制冷协会(IIR)、国际粮食…

题解:P3813 [FJOI2017] 矩阵填数

更差的阅读体验注意到,一个矩阵最大值为 \(x\) 的充要条件是:矩阵中的每一个元素 \(\le x\)。 矩阵中存在至少一个 \(x\)。仅考虑第一个条件是好做的。具体地,每一个格子存在一个取值的上限 \(mx_{i, j}\),也就是所…

第三章博文

1.关于数学三角形这道题目,从图形来看,它拥有自上而下的的逻辑结构,根据观察,可以列出以下的递归方程式: 假设我们使用一个二维数组c的下半三角来存放整个数学三角形,用i来控制行(从1开始),用j来控制列,那么就…

Spring BeanPostProcessor接口

[[Spring IOC 源码学习总笔记]] BeanPostProcessor BeanPostProcessor是 Spring 框架提供的一个扩展点接口,它允许开发者在 Spring 容器完成 Bean 的实例化、依赖注入之后,在初始化阶段的前后“拦截”并自定义 Bean …

25.11.13随笔联考总结

考试 正常通读题面,发现 T1 是构造,T2 很神秘没啥想法,T3 是一个比较明显的 dp,T4 是 ds。思考了一下决定还是顺序开。做 T1,有好几次都给我一种做出来的错觉,但是到最后一直有几个位置不合法,怎么微调都不能构…

完整教程:Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …