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

时间:2012-08-27 14:20:37

标签: c++ variable-assignment copy-constructor assignment-operator

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

int example_var = 3;  // with the assignment operator '='

int example_var(3);  // enclosing the value with parentheses 

是否有理由使用其中一个?

4 个答案:

答案 0 :(得分: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(*)() )

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

std::string s{std::string{}};

这种形式的优点是可以用括号直接初始化,但同时也不容易被误解。

使用哪一个?

我会推荐第三个选项(如果有的话)。话虽这么说,我倾向于经常使用第一个,或者第二个,取决于背景和类型......

答案 1 :(得分:6)

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

好读:

Is there a difference in C++ between copy initialization and direct initialization?

答案 2 :(得分:1)

他们的输出是一样的...... 这两种语法都调用了复制构造函数。 对于int和其他类似的内置数据类型,它是相同的,但是对于用户定义的数据类型有一些区别。

答案 3 :(得分:0)

他们编译成同样的东西。但是,两者都是变量初始化的一种形式,而不是赋值,这在C语言中有点重要,在C ++中很多,因为调用了完全不同的函数(构造函数和赋值)。