std::array初始化最安全:不写初值则默认初始化(内置类型未定义),{}值初始化为零;c风格数组需显式= {}清零;vector用(5)或{1,2,3}初始化,预留空间用reserve。

用 std::array 初始化最安全
直接在栈上定义固定大小数组时,std::array 比原生 C 风格数组更可控,编译期就能检查越界,且支持统一初始化语法。std::array 的构造行为明确:不写初值则默认初始化(内置类型为未定义值),加花括号则执行值初始化(内置类型为零)。
常见错误是以为 std::array<int> a;</int> 会自动清零——它不会,a[0] 是未定义值。必须显式初始化:
std::array<int> a1{}; // 所有元素为 0
std::array<int> a2{1, 2}; // a2[0]=1, a2[1]=2, a2[2]=0
std::array<int> a3{1, 2, 3}; // 全部指定</int></int></int>
注意:如果用 = {} 或 {},触发的是值初始化;若写成 = {1},则是聚合初始化,剩余元素按规则补零。
C 风格数组的初始化陷阱
原生数组如 int arr[5]; 声明后不初始化,内容是随机垃圾值,尤其在函数内局部声明时极危险。全局或静态作用域下才隐式零初始化,但不能依赖这个行为来“省事”。
推荐始终显式初始化:
-
int arr[5] = {};—— 全部设为 0(值初始化) -
int arr[5] = {1};——arr[0]=1,其余为 0 -
int arr[] = {1, 2, 3};—— 编译器推导长度为 3
错误写法:int arr[3] = {1, 2, 3, 4}; 编译失败;int arr[3]; arr = {0}; 语法非法——C 风格数组不可赋值。
动态数组用 std::vector 更实用
需要运行时确定大小,或后续要增删元素,别手写 new int[n]。用 std::vector 初始化清晰且自动管理内存:
std::vector<int> v1(5); // 5 个 0
std::vector<int> v2(5, 42); // 5 个 42
std::vector<int> v3{1, 2, 3}; // 列表初始化,size=3</int></int></int>
性能上,v1(5) 和 v2(5, 42) 都是 O(n),但后者避免了默认构造再赋值的冗余;若元素类型无默认构造函数,必须用带初值的构造形式。
容易忽略的点:std::vector<int> v(1000000);</int> 会立即分配并默认初始化全部元素,若只是预留空间,应改用 v.reserve(1000000) + push_back。
类成员数组怎么初始化
类内声明的 C 风格数组(如 int data[10];)不能在类定义里直接初始化,必须在构造函数中处理。错误写法:int data[10] = {};(C++11 起仅允许静态 const 整型成员)。
正确方式:
- 用
std::array:可在成员初始化列表中直接初始化data_{} - 用 C 风格数组:在构造函数体里调用
std::fill或memset(仅限 POD 类型) - 用
std::vector:在初始化列表中写data_(10)
例如:
struct S {
std::array<int> a_;
S() : a_{} {} // 合法
};</int>
而 int a_[5]; 在同位置写 a_{} 是非法的——这是最容易卡住的地方,不是语法不熟,是忘了 C 风格数组在类中就是不能这样初始化。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











