【问题标题】:Use curly braces({}) or equal sign(=) when initialize a variable [duplicate]初始化变量时使用花括号({})或等号(=)[重复]
【发布时间】:2018-05-31 09:17:01
【问题描述】:

在阅读The C++ Programming Language 4th Edition的时候,初始化一个变量,作者说用{}=初始化一个变量更好:

但我发现使用= 的人比使用{} 的人多。
那么哪种方法是坚持的好原则呢? ={}?

【问题讨论】:

  • 就像 Bjarne 所说,在前 30 年里,{} 选项不可用,所以旧代码使用 =。如果您使用此类旧代码,您可能应该继续使用= 以保持一致。在新代码中,您可以选择改用{},并且对于一些新功能,它是必需的。所以,一致性......
  • 无论你使用哪一个都保持不变,并且能够同时阅读
  • 我们能告诉你什么书没有?
  • 这些不是等价的。 T x = y;复制初始化(即使没有发生复制),并且不适用于显式构造函数。

标签: c++ initialization list-initialization


【解决方案1】:

您选择哪一种取决于您自己的编码风格。最重要的是,一旦您决定使用哪种方法,请始终如一地使用该方法。不要在两种方法之间切换。我个人使用 (=) 符号来初始化变量,因为这是我看到的最常见的变量初始化方法。自 C++98 以来的另一种变量初始化方式(称为“直接初始化”)是:

int variable(1)

但我会建议您不要这样做,它在某些情况下不起作用,因为您的书可能会涉及。

【讨论】:

  • 这样初始化变量在 C++98 中有效。对于所有未来的读者,这种初始化方法称为直接初始化。
  • 这不是真的。 {} 不同,建议用于新代码 Why is list initialization (using curly braces) better than the alternatives?int variable(1) 自第一个 C++ 标准 (C++98) 以来一直有效
  • @phuclv 谢谢!几年前我写了这个,当时不知道它在 C++98 中工作过,我想我把它与 X object{arg} 初始化混淆了(根据 cppreference)似乎已经引入C++11。我编辑了帖子以反映这一点。
【解决方案2】:

本书建议使用初始化器的一个原因是它会成为初始值。

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

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

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

【讨论】:

  • 是的,你是对的,这就是为什么我说大多数现代编译器都将其优化为相同的东西。
  • 问题是关于初始化语法,而不是赋值与初始化。
  • 我同意 juanchopanza。 “代码使用赋值运算符” - 不,它没有。这个答案是错误的,比没用还糟糕。
  • @SeanF 这取决于= 的使用位置 - 在某些 情况下,是的,它是一个赋值运算符(例如int a; a = 5;),在其他情况下,像这个,嗯..它不是。根据 C++ 标准,第 11.6.15 条:“以大括号或等于初始化器或 <...> 的 = 形式发生的初始化称为复制初始化。
  • @SeanF 另外:“你想知道什么比没用更糟糕?像你这样无缘无故花时间教训别人的人,因为它让你感到强大和强大。"
【解决方案3】:

在任何其他人提出愚蠢的想法之前 T a = b (其中 b 是 T 的类型)以赋值运算符调用结束,

让我们清楚一点,在 C++ 和任何面向对象的语言中,赋值运算符不能用于尚未创建的对象。 这是初始化,一直是复制构造函数的调用,与C++版本无关。

在这种情况下,“=”只是一个语法糖。

请参阅说明部分中的Reference

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

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多