当前位置: 首页 > news >正文

什么是 C++中的const?

🚀 什么是 const

const 的意思就是:不能改!

举个例子:

const int a = 5;

a = 10; // 错误!因为 a 是 const 的,不能改

就是这么简单!


🍎 举例1:常量变量

const int x = 100;

意思是:x 永远是100,不能变了。


🍔 举例2:函数参数用 const(防止修改)

void print(const int a) {
    // a 不能被改
    cout << a << endl;

 

这表示:a 是一个只读参数,函数里不能改它的值


🍟 举例3:引用 + const(超级常用!)

void print(const string& str) {
    cout << str << endl;

 

这个很重要!表示:

  • str 是传引用(效率高)

  • const 表示不能在函数里改这个字符串


🧊 举例4:指针 + const

你只记住下面这三种情况就够了:

写法含义
const int* p指向常量的指针(不能改 *p)
int* const p常量指针(不能改 p)
const int* const p两个都不能改(*p 不能改,p 也不能改)

📦 举例5:类的 const 成员函数

class Person {
public:
    void show() const {
        // 这里不能改任何成员变量
    }
}

这个 const 是说:我保证这个函数只用来看,不动任何数据。


🧠 总结口诀:

加了 const,表示不能改!

你以后只要看到 const,就问自己一句:“是不是说它不能改?”
 

我们下面再来看一个详细版本

constconstant 的缩写,意思是 “不变的”
在 C++ 中,它的作用是:

👉 告诉编译器某个变量(或函数)不允许被修改。


一、const 修饰普通变量

const int a = 7;

a = 8; // ❌ 错误:a 是常量,不能改

可以赋值给别人:

int b = a; // ✅ 正确


🚨 注意:const 虽然值不能改,但地址指向的内容可以被“非常规方式”改掉!

const int a = 7;

int* p = (int*)&a;

*p = 8;

cout << a; // 输出还是 7,而不是 8

解释:编译器会 优化 const 值的读取,不会重新读取内存中的值,所以就算你偷偷改了,也没用。


💡 想避开优化怎么办?

volatile

volatile const int a = 7;

int* p = (int*)&a;

*p = 8;

cout << a; // ✅ 现在输出 8


二、const 修饰指针变量(重点!)

👉 口诀记忆:

“左定值,右定向,const 修饰不变量”


A)const 修饰指针指向的内容

const int* p = &a;

  • 可以改 p 指向别的地址

  • 不可以改 *p 的内容(p 指向的值)

🔹 例子:

*p = 8; // ❌ 错误

p = &b; // ✅ 正确


B)const 修饰指针本身

int* const p = &a;

  • p 不能再指向其他变量

  • 但可以改 *p 的值


C)都修饰(完全只读)

const int* const p = &a;

  • p 不能变

  • *p 也不能变


三、const 修饰函数参数和返回值


A)值传递 + const(不常用)

void func(const int a);

值传递时参数本身就是拷贝,用 const 没多大必要,但加上可以防止误操作


B)引用传递 + const(常用!)

void show(const string& str);

  • 不复制,效率高

  • 不可修改,安全


C)指针参数 + const

void func(const int* p); // 不能改 *p 的值

void func(int* const p); // 不能改 p 指向的地址


D)函数返回值 + const

const int getValue();

如果函数返回 const 值,说明这个值不能再被赋值了:

getValue() = 10; // ❌ 错误

如果返回对象或引用,也可以加 const 限制只读性:

const Test& getTest();


四、const 修饰类成员函数

class MyClass {
public:
    int getVal() const; // ✅ 说明函数不会改成员变量
}

如果你这样写:

void show(const MyClass& obj) {obj.getVal(); // ✅ 正常
}

但如果 getVal() 没加 const,就会报错,因为 obj 是只读的。


✅ 小贴士:加了 const 的成员函数,不能改成员变量。

那如果我真的想改某个成员变量怎么办?


五、mutable 修饰变量(在 const 函数中也能改)

class Test {
public:
    void work() const {
        ++_counter; // ✅ 成功
    }

private:
    mutable int _counter;
};

🔹 只有 mutable 修饰的成员变量,在 const 成员函数中才能被修改。


✅ 总结(最重要的点):

用法意义
const int a = 5;a 是常量,不能变
const int* p指向的值不能改
int* const p指针地址不能改
const int* const p什么都不能改
void func(const int a)参数不能在函数中被改
void func(const int& a)引用参数,不复制,又不能改
int get() const函数保证不改类成员变量
mutable即使在 const 函数中也能改这个变量

相关文章:

  • SpringBoot Actuator指标收集:Micrometer与Prometheus集成
  • Matlab 基于模型参考自适应法和SVPWM的异步电机控制
  • `ImadcnIdentifierGenerator` 深度解析
  • Java学习笔记(数组,方法)
  • JavaWeb 课堂笔记 —— 16 MyBatis 动态SQL
  • Img2img-turbo 在2080Ti上的测试笔记
  • 双目视觉中的动态畸变矫正与跨视角信息融合
  • 4月19日记(补)算了和周日一块写了 4月20日日记
  • 前端工程化之自动化部署
  • 探秘STM32如何成为现代科技的隐形引擎
  • C++栈操作集合
  • SpringBoot编写单元测试
  • acwing--动态规划【线性dp】4/20、4/21
  • Lora 微调自定义device_map
  • 第一章:MySQL视图基础
  • 苍穹外卖阶段性总结 (超详细版)
  • 阿里HumanAIGC 团队开源实时数字人项目ChatAnyone
  • 俄罗斯方块-简单开发版
  • using用法整理
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 上册期中同步测试卷 B卷
  • 根据学习教育安排,上海市委中心组专题学习总书记力戒形式主义官僚主义重要论述
  • 中国在建结构第一高楼“天津117大厦”将复工,预计2027年完工
  • 电动自行车新国标将于9月1日落地,首批6家检测机构出炉
  • 老旧高层遭“连环漏水”,如何携手共治解难题?
  • 谷雨播种正当时,上海黄道婆纪念公园种下“都市棉田”
  • 信心从何而来|当消博会展商遇上关税战