初始化

#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 在堆上动态分配内存并初始化。
虽然传统的初始化方式(直接初始化和拷贝初始化)也能完成初始化任务,但大括号初始化的引入:
  1. 强制检查类型转换,避免隐式的窄化转换。

  2. 提供了一致且简洁的初始化方式。

  3. 防止未初始化变量的问题。

  4. 可以初始化数组、类成员等复杂类型时提供更多安全性和明确性。