在C++中初始化变量的偏好

Ran*_*bia 7 c++ variable-assignment copy-constructor assignment-operator

从c ++开始,注意到你可以用两种方式初始化变量

int example_var = 3;  // with the assignment operator '='
Run Code Online (Sandbox Code Playgroud)

要么

int example_var(3);  // enclosing the value with parentheses 
Run Code Online (Sandbox Code Playgroud)

是否有理由使用一个而不是另一个?

Dav*_*eas 7

第一种形式可以追溯到C时间,而第二种形式则是用C++添加的.添加的原因是在某些上下文中(特别是构造函数中的初始化列表),不允许使用第一种形式.

对于所有类型而言,这两者并不完全相同,这是其中一个可能更有用的地方.第一种形式在语义上意味着从右侧创建临时,然后从该临时变量构造变量.第二种形式是从参数直接初始化变量.

什么时候重要?

如果从右侧的变量的类型的隐式转换的第一种形式将失败,或者如果拷贝构造函数是不可用的,所以在这些情况下,你将不得不使用直接初始化.

第二种形式可以在比第一种形式更多的上下文中使用,它很容易出现最令人烦恼的解析.也就是说,在某些情况下,语法将与函数的声明(而不是常规变量的定义)兼容,并且语言确定在这种情况下,表达式将被解析为函数声明:

std::string s = std::string();  // ok declares a variable
std::string s( std::string() ); // declares a function: std::string s( std::string(*)() )
Run Code Online (Sandbox Code Playgroud)

最后在C++ 11中有第三种形式,它使用花括号:

std::string s{std::string{}};
Run Code Online (Sandbox Code Playgroud)

这种形式具有用括号直接初始化的优点,但同时它不容易被误解.

哪一个使用?

如果可以的话,我会推荐第三个选项.话虽这么说,我倾向于使用第一个,而不是第二个,或者第二个取决于上下文和类型......


Alo*_*ave 6

对于内置类型,int两者意味着相同.
但对于自定义数据类型,它们可能意味着不同 第一种格式称为复制初始化,第二种格式称为直接初始化.

好读:

复制初始化和直接初始化之间的C++有区别吗?