const对象在c++中从构造完成起即被语言设计禁止修改,编译器在编译期拒绝任何赋值操作,错误提示如“assignment of read-only variable”;const成员变量必须在初始化列表中初始化,不可在构造函数体内赋值;误用const_cast修改真正const对象将导致未定义行为。

const对象在C++里根本不能赋值
不是语法不支持,而是语言设计上直接禁止——const修饰的对象从构造完成起就进入“只读锁定”状态,编译器会在编译期拒绝任何试图修改它的表达式。哪怕你写的是a = 5;这种看似普通的赋值,只要a是const类型,就会触发错误。
常见报错信息和对应场景
典型错误提示是:error: assignment of read-only variable 'xxx'(GCC/Clang)或error C3892: 'xxx' : you cannot assign to a variable that is const(MSVC)。这通常出现在以下情况:
- 对
const int x = 10;执行x = 20; - 把
const成员变量当成普通成员,在构造函数外用this->m_val = 42;赋值 - 误以为
const T*或T* const能被赋值,结果对指针所指内容或指针本身做了修改
const成员变量只能在初始化列表里设值
类里的const成员不能在构造函数体内赋值,必须走成员初始化列表。否则编译器会报error: uninitialized const member或类似提示。
class A {
const int val;
public:
A(int v) : val(v) {} // ✅ 正确:初始化列表
// A(int v) { val = v; } // ❌ 错误:构造函数体里赋值无效
};
注意:val没有默认构造函数,也不能被= default掉;如果没在初始化列表里给它值,连编译都过不去。
想改?那就别用const,或者换思路
如果你发现代码里反复想给某个“本该不变”的东西赋值,大概率是设计意图和const语义冲突了。这时候要判断:
- 是否真需要运行时可变?→ 改成非
const变量 - 是否只是想在类内部修改,对外保持只读?→ 用
mutable修饰该成员(比如缓存、计数器) - 是否想绕过const限制强行写?→ 不要用
const_cast,那是在破坏类型系统,容易引发未定义行为
最常被忽略的一点:const修饰的是对象的“逻辑不可变性”,不是内存保护。一旦你用const_cast去掉const再写,而原对象确实是const定义的(比如const int x = 5;),那写操作就是未定义行为——可能崩溃,也可能暂时看起来正常,但谁也保不准。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











