推荐类内定义固定大小数组用 std::array;运行时大小必须用 std::vector;静态数组需声明与定义分离,constexpr 静态数组可 inline 定义;注意初始化顺序与零初始化语法。

类内定义固定大小数组:用 std::array 或 C 风格数组?
直接在类里写 int arr[10]; 是合法的,但容易踩内存管理或拷贝语义的坑。C++11 起更推荐用 std::array<int></int> —— 它是聚合类型、支持拷贝/赋值、能和范围 for 一起用,且不退化为指针。
-
std::array的大小必须是编译期常量,比如constexpr int N = 5;后再写std::array<int n> a;</int> - C 风格数组(如
double data[8];)在类中会按字节原样布局,但无法直接赋值:a.data = b.data;是错的,得用std::copy或循环 - 如果数组元素类型没有默认构造函数,C 风格数组不会自动调用构造函数;而
std::array会——这点在含自定义类型的类中很关键
类内定义运行时大小数组:必须用 std::vector
类里不能写 int arr[n];(n 是变量),这在 C++ 标准里不是合法的类成员声明。想支持动态长度,唯一安全、标准的方式是用 std::vector。
-
std::vector在栈上只存控制块(通常 24 字节),数据在堆上分配,构造/析构自动管理 - 初始化要留意:写
std::vector<int> buf{1, 2, 3};</int>是列表初始化;写std::vector<int> buf(10);</int>是构造 10 个默认值 - 避免裸
new int[n]:手动delete[]容易漏、异常不安全,且不符合 RAII 原则
静态数组成员怎么写?注意定义和声明分离
类内声明 static const int sizes[3]; 只是声明,必须在类外定义并初始化(除非是整型 constexpr 静态数据成员)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 非 constexpr 的静态数组:类内声明 + 类外定义,例如:
class Config { public: static const int modes[2]; }; const int Config::modes[2] = {1, 2}; - constexpr 静态数组(C++17 起可 inline):
static constexpr int defaults[] = {0, 1, 1};—— 这种可以直接在类内定义,无需类外重复 - 静态
std::vector不行:它不是字面量类型,不能声明为static constexpr;若真需要全局共享动态数组,用static inline std::vector(C++17)
成员数组的生命周期和初始化顺序陷阱
数组成员和其他成员一样,在构造函数体执行前就已完成初始化。但顺序依赖于类中声明的顺序,不是初始化列表里的顺序。
立即学习“C++免费学习笔记(深入)”;
- 如果数组元素类型有构造函数,且依赖前面声明的某个成员变量,就会出问题——因为那个变量可能还没构造完
- 初始化列表里对数组不能“整体赋值”,比如
MyClass() : arr{1,2,3}只对聚合类型有效;对std::vector得写buf({1,2,3})或用构造函数参数 - POD 数组(如
int arr[4];)默认不初始化,值是未定义的;加= {}才能零初始化:int arr[4] = {};

















