const成员必须用初始化列表初始化,不能在构造函数体内赋值,因其一旦创建即不可修改;初始化列表是唯一合法时机,且const成员名必须出现在列表中。

const成员必须用初始化列表,不能在构造函数体内赋值
因为const成员一旦创建就不可修改,而构造函数体内的语句属于“赋值”阶段——此时对象已开始构造,const成员早已存在(但未初始化),再赋值会直接编译失败。唯一合法时机是在进入构造函数体之前,即通过初始化列表完成“初始化”而非“赋值”。
初始化列表写法:冒号后跟成员名(值),顺序无关但声明顺序决定实际执行顺序
初始化列表语法固定:Constructor(args) : member1(val1), member2(val2) { }。注意:
-
const成员名必须出现在列表中,且括号内是初始值(可为参数、字面量、表达式) - 即使列表里写成
b(a), a(42),只要类中声明顺序是int a; const int b;,则a一定先初始化,b后初始化——否则用未初始化的a计算b就是未定义行为 - 编译器通常不报错,但运行时可能崩溃或输出随机值;建议开启
-Wreorder(GCC/Clang)捕获这类隐患
静态const成员的初始化规则不同:分整型/非整型、类内/类外
非静态 const 成员只能靠初始化列表;但静态 const 成员另有路径:
- C++11 起,
static const整型或枚举类型可在类内直接初始化,如:static const int MAX_SIZE = 100; - 非整型(如
std::string、double)或需兼容旧标准时,必须类内声明 + 类外定义:static const std::string name;,然后在 .cpp 文件中写const std::string MyClass::name = "hello"; - 类外定义时不能加
static关键字,否则重复定义
常见错误现象和绕不过去的硬限制
以下写法都会导致编译失败:
-
const int x = 5;直接在类内赋值(非静态)→ 错误:非静态const成员不允许就地初始化(C++11 后允许非静态就地初始化,但仅限于非const成员;const仍不行) - 在构造函数体中写
x = 5;→ 错误:assignment of read-only member - 漏掉初始化列表,哪怕只漏一个
const成员 → 错误:uninitialized const member - 给
const引用成员(如const int& ref;)试图在函数体内绑定 → 错误:uninitialized reference member
真正容易被忽略的是:初始化列表不是“可选优化”,而是对 const 和引用成员的强制语法门槛;哪怕你只初始化一个 const 成员,整个构造函数就必须带冒号和列表——没有例外。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











