当初始化一个变量时,使用花括号({})或等号(=)。

15

当我阅读C++编程语言 第四版时,作者提到在初始化变量时,最好使用{}而不是=

variable initialization

但我发现更多的人使用=而不是{}
那么哪种方法是一个好的原则?=还是{}


就像Bjarne所说的那样,在前30年中,{}选项是不可用的,因此旧代码使用=。如果您正在处理这样的旧代码,则应该继续使用=以保持一致性。在新代码中,您可以选择使用{},并且在某些新功能中它是必需的。所以,一致性... - Bo Persson
无论您使用哪个,请保持相同,并能够阅读两者。 - Jake Freeman
1
我们能告诉你什么书没有说到的吗? - Galik
这两者不是等价的。T x = y;拷贝初始化(即使没有复制发生),并且不能用于显式构造函数。 - rustyx
1
这个回答解决了你的问题吗?为什么使用花括号进行列表初始化比其他方法更好?(https://dev59.com/3GMl5IYBdhLWcg3wqIdh) - phuclv
3个回答

9

选择哪种方式取决于您自己的编码风格和您认为最好的方式。最重要的是,一旦您决定使用哪种方法,请始终使用该方法。不要在不同方法之间切换,这会使您的代码阅读起来非常混乱。自C++98以来,还有一种变量初始化风格(称为“直接初始化”):

int variable(1)

但我建议你不要这样做,因为在某些情况下它并不起作用,就像你的书可能会介绍的那样。

我个人的风格是我祖父在20世纪60年代从事IBM大型机时教给我的:

int
    Variable1 = 2,
    Variable2 = 39,
    Variable3 = 45;

bool
    Foo = true,
    Bar = false;

// etc.

你会注意到我使用了“=”号,而不是花括号。这似乎是大多数人写代码的方式,所以我和我的爷爷也这样写,以减少人们阅读我们代码时的混淆。我不知道在公司或组织中这种方法有多少被接受,我只是觉得它是最吸引人和直观的风格。它还可以节省很多打字的时间。


在C++98中,将变量初始化为这样可以工作。对于所有未来的读者,这种初始化方法称为直接初始化。 - FriskySaga
这不是真的。{}与其他方式不同,并且建议在新代码中使用。关于为什么列表初始化(使用花括号)更好的问题,请参考此处。自C++98标准以来,int variable(1)就一直可用。 - phuclv
@phuclv 谢谢!我几年前写了这个代码,当时不知道它可以在C++98中运行,我想我可能将它与X对象 {arg}初始化混淆了,后者(根据cppreference)似乎是在C++11中引入的。我已经编辑了帖子以反映这一点。 - Shades

-2

在其他人提出愚蠢的想法之前,T a = b(其中b是T类型)会导致赋值运算符调用,

让我们澄清一下,在C++和任何面向对象的语言中,赋值运算符不能用于尚未创建的对象。 这是初始化,并且这始终是复制构造函数的调用,不管C++版本如何。

在这种情况下,'='只是一种语法糖。

请参见解释部分中的参考

每当从相同类型的另一个对象(除非重载决议选择更好的匹配项或调用被省略)初始化对象(通过直接初始化或复制初始化)时,都会调用复制构造函数,其中包括 初始化:T a = b; 或 T a(b);,其中b是T类型;


-5

书中建议使用初始化器的原因之一是它成为了初始值。

当使用赋值符号'='时,在某些情况下,您最终会构造对象并给它一个初始值,然后代码使用类类型的赋值运算符来更改初始值,因此效率较低。这仅在某些情况下发生,取决于可用的构造函数等。

但是,在大多数情况下,现代编译器可以优化它以使其成为相同的事情。所以不值得担心。

C++的一个问题是,无论多么简单的事情,总有几种方法可以做到相同的事情。


1
是的,你说得对,这就是为什么我说大多数现代编译器都会将其优化为相同的东西。 - Sean F
4
问题涉及初始化语法,而不是赋值与初始化的区别。 - juanchopanza
3
我同意 juanchopanza 的观点。“代码使用的是赋值运算符” - 不,它没有。这个答案完全错误,比没回答还要糟糕。 - MSalters
4
取决于=的使用场合-在某些情况下,它是一个赋值运算符(例如:int a; a = 5;),在其他情况下,比如这个例子,它不是。根据C++标准,第11.6.15条款:“在花括号或等号初始化器的=形式中发生的初始化,或者<...>称为复制初始化。” - Algirdas Preidžius
2
@SeanF 另外:这个声明中有太多的讽刺意味了:“你知道什么比没用更糟糕吗?像你这样浪费时间给别人上课,没有任何理由,只是因为这让你感觉强大和有权力。” - Algirdas Preidžius
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接