📜  C++初始化问题(1)

📅  最后修改于: 2023-12-03 14:39:59.393000             🧑  作者: Mango

C++ 初始化问题

在 C++ 中,变量的初始化是非常重要的一个环节。正确的初始化可以避免许多意想不到的错误,提高程序的可读性和可维护性。

变量的初始化方式

C++ 中有多种变量初始化的方式,包括默认初始化、值初始化、列表初始化、直接初始化等,具体如下:

默认初始化

默认初始化是指在定义变量时,如果没有提供初始值,则使用默认值进行初始化。对于基本类型,其默认值为未定义(即不确定的);对于类类型,则调用其默认构造函数进行初始化。例如:

int a; // a 的值未定义
std::string str; // str 调用了默认构造函数进行初始化
值初始化

值初始化是指在定义变量时,使用括号(或等号)并提供空的初始化列表(或不提供任何初始化列表),进行初始化。

对于基本类型,其值初始化将其值设为 0;对于类类型,其值初始化将其值设为默认构造函数的返回值。例如:

int a{}; // 将 a 初始化为 0
int b = {}; // 将 b 初始化为 0
std::string str{}; // 将 str 初始化为空字符串
std::string str2 = {}; // 同上
列表初始化

列表初始化是指在定义变量时,使用花括号(或等号)并提供一个初始化列表进行初始化。对于类类型,其初始化列表中提供的参数将被传递给相应的构造函数进行初始化。

int a{1}; // 将 a 初始化为 1
int b = {2}; // 同上
std::string str{"hello"}; // 将 str 初始化为 "hello"
std::string str2 = {"world"}; // 同上
直接初始化

直接初始化是指在定义变量时,使用小括号并提供相应的参数列表进行初始化。对于类类型,将使用与参数列表匹配的相应的构造函数进行初始化。例如:

int a(1); // 将 a 初始化为 1
std::string str("hello"); // 将 str 初始化为 "hello"
C++11 新增特性

在 C++11 中,又新增了一些变量初始化的特性,例如:

列表初始化中的自动类型推导

对于列表初始化,可以使用 auto 关键字进行自动类型推导。例如:

auto x{1}; // x 的类型为 int
auto y{"hello"}; // y 的类型为 const char *
uniform initialization

uniform initialization 是一种新的初始化方式,使用花括号并提供一个初始化列表进行初始化。不同于之前的列表初始化,uniform initialization 不允许隐式类型转换,从而可以避免由于不同类型之间的隐式转换而导致的意想不到的错误。例如:

int a1{1}; // 将 a1 初始化为 1
double b1{2}; // 将 b1 初始化为 2.0
int c1{2.5}; // 编译错误:不允许 double 到 int 的隐式转换
总结

变量的初始化是 C++ 中非常重要的一个环节,正确的初始化可以避免许多意想不到的错误,并提高程序的可读性和可维护性。在 C++ 中,有多种不同的初始化方式,开发人员可以根据需求灵活选择。在 C++11 中,又新增了一些新的初始化方式,可以更方便地进行变量初始化。