初始化
#include <iostream>
#include <string>
int main() {
// 1. 直接初始化(Direct Initialization)
int x(10); // 直接初始化
std::cout << "Direct Initialization: " << x << std::endl;
std::string str("Hello"); // 直接初始化字符串
std::cout << "Direct Initialization String: " << str << std::endl;
// 2. 拷贝初始化(Copy Initialization)
int y = 20; // 拷贝初始化
std::cout << "Copy Initialization: " << y << std::endl;
std::string str2 = "World"; // 拷贝初始化字符串
std::cout << "Copy Initialization String: " << str2 << std::endl;
// 3. 列表初始化(List Initialization)
int z{30}; // 列表初始化
std::cout << "List Initialization: " << z << std::endl;
std::string str3{"C++"}; // 列表初始化字符串
std::cout << "List Initialization String: " << str3 << std::endl;
// 4. 均匀初始化(Uniform Initialization)
int w{40}; // 均匀初始化
std::cout << "Uniform Initialization: " << w << std::endl;
std::string str4{"Programming"}; // 均匀初始化字符串
std::cout << "Uniform Initialization String: " << str4 << std::endl;
// 5. 值初始化(Value Initialization)
int a{}; // 值初始化,a 会被初始化为 0
std::cout << "Value Initialization: " << a << std::endl;
std::string str5{}; // 值初始化,str5 会被初始化为空字符串
std::cout << "Value Initialization String: " << str5 << std::endl;
// 6. 零初始化(Zero Initialization)
int arr[5]{}; // 零初始化,数组元素都是 0
std::cout << "Zero Initialization Array: ";
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 7. 动态初始化(Dynamic Initialization)
int* p = new int(50); // 动态初始化,值为 50
std::cout << "Dynamic Initialization: " << *p << std::endl;
std::string* str6 = new std::string("Dynamic String"); // 动态初始化字符串
std::cout << "Dynamic Initialization String: " << *str6 << std::endl;
// 清理动态分配的内存
delete p;
delete str6;
return 0;
}
初始化方式 | 示例代码 | 说明 |
---|---|---|
直接初始化 | int x(10); |
使用括号 () 来直接初始化变量。 |
拷贝初始化 | int y = 20; |
使用 = 运算符进行初始化。 |
列表初始化 | int z{30}; |
使用花括号 {} 来初始化,防止窄化转换。 |
均匀初始化 | int w{40}; |
与列表初始化相似,适用于所有类型,提供一致的初始化语法。 |
值初始化 | int a{}; |
使用 {} 初始化,内置类型会初始化为零。 |
零初始化 | int arr[5]{}; |
数组或对象成员通过 {} 初始化,所有元素都会初始化为零。 |
动态初始化 | int* p = new int(50); |
使用 new 在堆上动态分配内存并初始化。 |
虽然传统的初始化方式(直接初始化和拷贝初始化)也能完成初始化任务,但大括号初始化的引入: |
-
强制检查类型转换,避免隐式的窄化转换。
-
提供了一致且简洁的初始化方式。
-
防止未初始化变量的问题。
-
可以初始化数组、类成员等复杂类型时提供更多安全性和明确性。