int
、float
、double
、char
等)通过赋值符号初始化:
int a = 10; // 使用赋值符号初始化
float b = 3.14f; // 使用赋值符号初始化
double c = 2.718; // 使用赋值符号初始化
char d = 'A'; // 使用赋值符号初始化
通过构造函数风格的圆括号初始化:
int a(10); // 使用圆括号初始化
float b(3.14f); // 使用圆括号初始化
double c(2.718); // 使用圆括号初始化
char d('A'); // 使用圆括号初始化
统一初始化语法,更安全:
int a{10}; // 使用花括号初始化
float b{3.14f}; // 使用花括号初始化
double c{2.718}; // 使用花括号初始化
char d{'A'}; // 使用花括号初始化
未显式初始化时的行为:
0
。int global_var; // 全局变量,默认初始化为 0
static int static_var; // 静态变量,默认初始化为 0
void func() {
int local_var; // 局部变量,未初始化,值是未定义的
}
std::string
、std::vector
等)std::string str = "Hello"; // 使用赋值符号初始化
std::vector<int> vec = {1, 2, 3}; // 使用赋值符号和列表初始化
std::string str("Hello"); // 使用圆括号初始化
std::vector<int> vec(3, 10); // 创建包含 3 个 10 的向量
std::string str{"Hello"}; // 使用花括号初始化
std::vector<int> vec{1, 2, 3}; // 使用花括号初始化
调用默认构造函数:
std::string str; // 默认初始化为空字符串
std::vector<int> vec; // 默认初始化为空向量
class MyClass {
public:
int x;
MyClass(int val) : x(val) {} // 构造函数
};
MyClass obj = MyClass(10); // 使用赋值符号和构造函数初始化
MyClass obj(10); // 使用圆括号和构造函数初始化
MyClass obj{10}; // 使用花括号和构造函数初始化
调用默认构造函数:
class MyClass {
public:
int x;
MyClass() : x(0) {} // 默认构造函数
};
MyClass obj; // 默认初始化,调用默认构造函数
int arr[] = {1, 2, 3, 4}; // 使用赋值符号和列表初始化
int arr[]{1, 2, 3, 4}; // 使用花括号初始化
0
。int global_arr[5]; // 全局数组,默认初始化为 0
static int static_arr[5]; // 静态数组,默认初始化为 0
void func() {
int local_arr[5]; // 局部数组,未初始化
}
int* ptr = nullptr; // 初始化为 nullptr
int* ptr = &a; // 初始化为变量地址
int* ptr(nullptr); // 使用圆括号初始化
int* ptr(&a); // 使用圆括号初始化
int* ptr{nullptr}; // 使用花括号初始化
int* ptr{&a}; // 使用花括号初始化
未显式初始化时为未定义值:
int* ptr; // 未初始化,值是未定义的
enum Color { RED, GREEN, BLUE };
Color color = RED; // 使用赋值符号初始化
Color color(RED); // 使用圆括号初始化
Color color{RED}; // 使用花括号初始化
未显式初始化时为未定义值:
Color color; // 未初始化,值是未定义的
union Data {
int i;
float f;
char str[20];
} data = {10}; // 初始化第一个成员
union Data {
int i;
float f;
char str[20];
} data{10}; // 初始化第一个成员
未显式初始化时,第一个成员的值是未定义的:
union Data data; // 未初始化,第一个成员的值是未定义的
struct Point {
int x, y;
} p = {10, 20}; // 使用赋值符号和列表初始化
struct Point {
int x, y;
} p{10, 20}; // 使用花括号初始化
调用默认构造函数:
struct Point {
int x, y;
Point() : x(0), y(0) {} // 默认构造函数
};
Point p; // 默认初始化,调用默认构造函数
使用花括号 {}
初始化对象:
int arr[]{1, 2, 3, 4}; // 数组
std::vector<int> vec{1, 2, 3, 4}; // 标准库容器
std::pair<int, double> p{10, 3.14}; // 标准库 pair
std::map<int, std::string> m{{1, "one"}, {2, "two"}}; // 标准库 map
使用 {}
初始化所有类型:
int a{10}; // 基本数据类型
std::string str{"Hello"}; // 标准库类型
std::vector<int> vec{1,2,3}; // 容器
MyClass obj{10}; // 自定义类
优点:
注意事项:
显式初始化为默认值:
int a{}; // 初始化为 0
float b{}; // 初始化为 0.0f
std::string str{}; // 调用默认构造函数
显式初始化为 0
:
int global_var = 0; // 全局变量显式初始化为 0
static int static_var = 0; // 静态变量显式初始化为 0
初始化聚合类型(无构造函数、公有成员):
struct Point {
int x, y;
};
Point p{10, 20}; // 聚合初始化
构造函数调用其他构造函数:
class MyClass {
public:
MyClass(int val) : x(val) {} // 主构造函数
MyClass() : MyClass(0) {} // 委托构造函数
private:
int x;
};
初始化方式 | 语法示例 | 适用场景 |
---|---|---|
直接初始化 | int a = 10; |
简单类型显式赋值 |
圆括号初始化 | int a(10); |
显式调用构造函数 |
花括号初始化 | int a{10}; |
类型安全、统一语法 |
默认初始化 | int a; |
全局/静态变量(初始化为 0) |
值初始化 | int a{}; |
显式初始化为默认值 |
聚合初始化 | Point p{10, 20}; |
无构造函数的聚合类型 |
委托构造函数 | MyClass() : MyClass(0){} |
简化构造函数逻辑 |