选择哪种方式取决于您自己的编码风格和您认为最好的方式。最重要的是,一旦您决定使用哪种方法,请始终使用该方法。不要在不同方法之间切换,这会使您的代码阅读起来非常混乱。自C++98以来,还有一种变量初始化风格(称为“直接初始化”):
int variable(1)
但我建议你不要这样做,因为在某些情况下它并不起作用,就像你的书可能会介绍的那样。
我个人的风格是我祖父在20世纪60年代从事IBM大型机时教给我的:
int
Variable1 = 2,
Variable2 = 39,
Variable3 = 45;
bool
Foo = true,
Bar = false;
// etc.
你会注意到我使用了“=”号,而不是花括号。这似乎是大多数人写代码的方式,所以我和我的爷爷也这样写,以减少人们阅读我们代码时的混淆。我不知道在公司或组织中这种方法有多少被接受,我只是觉得它是最吸引人和直观的风格。它还可以节省很多打字的时间。
在其他人提出愚蠢的想法之前,T a = b(其中b是T类型)会导致赋值运算符调用,
让我们澄清一下,在C++和任何面向对象的语言中,赋值运算符不能用于尚未创建的对象。 这是初始化,并且这始终是复制构造函数的调用,不管C++版本如何。
在这种情况下,'='只是一种语法糖。
请参见解释部分中的参考:
每当从相同类型的另一个对象(除非重载决议选择更好的匹配项或调用被省略)初始化对象(通过直接初始化或复制初始化)时,都会调用复制构造函数,其中包括 初始化:T a = b; 或 T a(b);,其中b是T类型;
书中建议使用初始化器的原因之一是它成为了初始值。
当使用赋值符号'='时,在某些情况下,您最终会构造对象并给它一个初始值,然后代码使用类类型的赋值运算符来更改初始值,因此效率较低。这仅在某些情况下发生,取决于可用的构造函数等。
但是,在大多数情况下,现代编译器可以优化它以使其成为相同的事情。所以不值得担心。
C++的一个问题是,无论多么简单的事情,总有几种方法可以做到相同的事情。
=
的使用场合-在某些情况下,它是一个赋值运算符(例如:int a; a = 5;),在其他情况下,比如这个例子,它不是。根据C++标准,第11.6.15条款:“在花括号或等号初始化器的=形式中发生的初始化,或者<...>称为复制初始化。” - Algirdas Preidžius
{}
选项是不可用的,因此旧代码使用=
。如果您正在处理这样的旧代码,则应该继续使用=
以保持一致性。在新代码中,您可以选择使用{}
,并且在某些新功能中它是必需的。所以,一致性... - Bo PerssonT x = y;
是拷贝初始化(即使没有复制发生),并且不能用于显式构造函数。 - rustyx