const数组必须定义时初始化,不可先声明后赋值;全局/命名空间作用域需全量常量表达式初始化;类内static const数组须类外定义;局部const数组长度须为常量表达式;零初始化用{};std::array更安全;const_cast修改未定义。

const 数组必须在定义时初始化,不能先声明再赋值;C++ 允许用 const 变量作为数组长度(C 不行),但初始化方式取决于数组作用域和类型。
全局或命名空间作用域的 const 数组
这类数组在定义时就必须提供完整初始化列表,且所有元素值必须是常量表达式。
- 正确写法:
const int arr[3] = {1, 2, 3}; - 错误写法:
const int arr[3]; arr[0] = 1;—— 编译失败,arr是只读,无法后续赋值 - 允许省略大小,由编译器推导:
const char msg[] = "hello";(注意末尾隐含'\0') - 若只初始化部分元素,未显式初始化的元素会按规则补零(如
const int a[5] = {1};→a[0]=1, a[1..4]=0)
类内 const 静态成员数组
静态 const 数组属于类的静态存储,必须在类外定义并初始化(即使已声明为 const)。
- 类内只声明:
static const int data[2]; - 类外定义(注意不加
static):const int MyClass::data[2] = {42, 99}; - 不能在类内直接初始化数组(哪怕用
= {…}),C++11 也不支持该语法 - 若数组元素类型不是字面值类型(如含自定义构造函数的类),则必须确保其默认构造函数可用,或显式调用
函数内局部 const 数组
局部 const 数组同样必须在定义时初始化,且长度必须是常量表达式。
立即学习“C++免费学习笔记(深入)”;
- 允许用
constexpr或字面值常量作长度:constexpr int N = 5; const int buf[N] = {}; - 禁止用运行期变量(哪怕带
const修饰):const int n = get_size(); const int x[n];—— 错误,n不是常量表达式 - 初始化为空花括号表示零初始化:
const double vals[4] = {};→ 所有元素为0.0 - 使用
std::array替代原生数组可获得更安全的初始化行为,例如:const std::array<int> a = {1,2,3};</int>
最容易被忽略的是:const 数组一旦初始化完成,就彻底不可修改——连通过指针绕过 const 限定(如 const_cast)去改写,也属于未定义行为。别指望“只读”只是编译器提醒,它约束的是整个对象生命周期的语义。


















