C++11 初始化机制详解
一、初始化
1.1 未初始化的变量行为
内置类型
对于全局/静态的内置类型(如 int, char, 数组等),若不初始化,默认被初始化为 0。但在栈上定义的变量若不初始化,其值为随机值(垃圾值),访问未初始化的指针可能导致野指针问题。
#include <cstdio>
int main() {
int all_a; // 全局变量,实际为 0
int arr[18];
int a;
int* pa;
printf("all_a:%d, pa: %p, a:%d\n", all_a, pa, a);
return 0;
}
建议:在栈上定义的变量最好显式初始化,例如 int a = 0;,指针应初始化为 nullptr。
自定义类型
C++ 中自定义类型(类/结构体)若未显式初始化,编译器会调用默认构造函数或成员初始化。但在 C 语言阶段,结构体依然遵循栈上随机值的规则。
1.2 良好的初始化习惯
内置类型
int a = 0;char b = '0';int* pa = nullptr;(C++11)
结构体对象
C++ 结构体自带默认成员函数,通常无需手动初始化,但显式初始化是良好习惯。C++98 仅支持结构体和数组的花括号初始化,不支持类。
1.3 花括号初始化:C++98 vs C++11
C++98 的花括号初始化
主要用于内置类型和结构体。
int main() {
int arr[9] = {1, 3, 4, 5, 6};
struct mytest t = {1, };
;
}


