不行。构造函数不能用const修饰,因为其职责是初始化对象,与const成员函数“不修改对象状态”的语义冲突;const成员变量必须在初始化列表中赋值;const对象只能调用const成员函数;mutable是const成员函数内唯一可修改的例外。

构造函数不能用 const 修饰
直接回答:不行。const 不能加在构造函数声明或定义末尾,比如 Date() const 是语法错误,编译器会报错(常见提示如 error: constructors cannot be declared 'const')。
原因很实在:构造函数的职责是初始化对象,也就是“从无到有”地给成员变量赋值。而 const 成员函数的语义是“不修改对象状态”,这和构造过程天然冲突——此时对象还没成型,谈不上“保持不变”。编译器禁止这种写法,不是限制你,而是防止逻辑矛盾。
const 成员变量必须在初始化列表中赋值
虽然构造函数本身不能加 const,但类里若有 const 成员变量,它必须靠构造函数的**成员初始化列表**来设置初值,不能在函数体里用赋值语句。
-
const int _id;声明后,_id = 123;在构造函数体内是非法的 - 必须写成
Date(int id) : _id(id) { } - 如果没出现在初始化列表里,编译器会报错(如
error: uninitialized const member)
const 对象只能调用 const 成员函数
这是容易混淆的点:构造完的 const 对象(如 const Date d(2026, 10, 9);),后续只能调用带 const 后缀的成员函数。
-
d.Print();要求Print()声明为void Print() const; - 否则报错:
error: passing 'const Date' as 'this' argument discards qualifiers - 这个
const修饰的是隐含的this指针,跟构造函数无关
mutable 是 const 成员函数里唯一的“例外出口”
如果你真需要在 const 成员函数里改点什么(比如缓存、访问计数),得靠 mutable 修饰那个变量。
-
mutable int _accessCount;可以在void Print() const里被修改 - 但普通成员(哪怕只是
int)在const函数里一赋值就报错 - 别滥用
mutable:它只该用于不影响对象逻辑状态的辅助字段
真正卡住人的地方往往不是语法能不能写,而是搞混了“谁在什么时候被 const 约束”——构造函数管初始化,const 成员函数管访问,const 成员变量管生命周期内不可变。三者边界清了,错误自然少。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











