5

开始了C++和注意到您可以通过两种方式优先于C++初始化变量

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

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

有没有理由使用了另一种初始化变量?

+0

只要你知道,如果你在自己的类型上测试它,'MyClass obj = 5;'调用构造函数,而不是赋值运算符。我也知道这已经被问过;我会尽力找到它去的地方。 – chris

+1

从技术上讲,这些都不是任务。他们是*初始化*。他们定义并初始化一个新变量。将新值分配给现有变量时会发生赋值。 ('int i = 1'是初始化,但是'i = 2'是赋值) – jalf

回答

6

第一种形式可以追溯到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{}}; 

这种形式具有括号直接初始化的优点,但在同一时间,它是不容易出现误解。

要使用哪一个?

我会推荐第三个选项,如果可用的话。也就是说,我倾向于首先使用第一个,或者第二个取决于上下文和类型...

0

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

1

他们的输出是一样的... 两个语法调用拷贝构造函数。 int和其他类似的内置数据类型是一样的,但用户定义的数据类型有一些不同。