用{}或= {}可零初始化POD类型数组,如int arr[10] = {};等价于{0},但= {}更直观;std::vector(100, 0)安全高效;new int[100]()或{}实现堆上零初始化;非POD类型需依赖构造函数,不可假设清零。

用 {} 或 = {} 初始化内置数组最简单
对 int、double、char 这类 POD 类型数组,直接用空花括号就能零初始化,编译器会保证所有元素为 0:
int arr[10] = {};这等价于 int arr[10] = {0}; —— 只显式初始化第一个元素为 0,其余由标准规定自动补 0。两种写法都可靠,但 = {} 更直观,且不依赖“第一个元素触发零初始化”的隐式规则。
- 适用于栈上数组、全局/静态数组、
std::array - 不能省略大小(如
int arr[] = {};是非法的,除非有初始化值) - 如果写了部分值(如
int a[5] = {1};),剩余元素仍为 0;但若写成{1, 2},则只初始化前两个,其余为 0
std::vector 构造时指定大小和初始值更安全
动态数组首选 std::vector,构造函数直接支持全零初始化:
std::vector<int> vec(100, 0); // 100 个 int,每个都是 0
注意:第二个参数是值,不是“是否初始化”。它不会调用默认构造(对 int 无所谓),而是逐个复制该值。
立即学习“C++免费学习笔记(深入)”;
- 避免手动
vec.resize(100)后再循环赋 0 —— 多余且易错 - 对于自定义类型,
std::vector<t>(n)</t>(无第二参数)会默认构造 n 个对象,不一定为 0;需明确传0或T{} - 性能上,
std::vector<int>(n, 0)</int>通常比resize+assign更高效
堆上 new 数组必须用 () 才能零初始化
用 new 分配原生数组时,[] 后加括号是关键:
int* p = new int[100](); // 注意末尾的 ()
没有括号(new int[100])只会分配内存,内容是未定义的垃圾值;加 () 触发值初始化(对 int 即零初始化)。
-
new int[100]{};(C++11 起)也合法,效果相同,更现代 - 务必配对
delete[] p;,否则内存泄漏 - 实际项目中优先用
std::vector或std::unique_ptr<int></int>,避免裸指针管理
结构体或类数组的零初始化要小心成员类型
如果数组元素是自定义类型,= {} 或 () 是否真能清零,取决于该类型的构造行为:
struct S { int x; double y; };<br>S arr[5] = {}; // x 和 y 都为 0但若 S 有用户定义的默认构造函数,= {} 会调用它,而不是逐字节清零 —— 结果可能不是全 0。
- POD 类型(无用户构造/析构/虚函数/私有非静态成员)才能靠
= {}安全零初始化 - 不确定时,用
std::memset(arr, 0, sizeof(arr));强制二进制清零(仅限 POD) - 非 POD 类型应依赖其构造函数语义,不要假设“初始化=清零”
真正麻烦的是混合场景:比如结构体里含 std::string 成员,此时 = {} 会调用 std::string 的默认构造,而非把内存设为 0 —— 这是正确行为,但和“全为 0”字面意思不同。


















