初始化变量时使用花括号({})或等号(=)

Use curly braces({}) or equal sign(=) when initialize a variable

我在看The C++ Programming Language 4th Edition初始化变量的时候,作者说用{}=初始化变量好:

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

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

int variable(1)

但我会建议你不要这样做,它在某些情况下不起作用,正如你的书可能涵盖的那样。

我的个人风格是我在 1960 年代从事 IBM 大型机工作的祖父教给我的:

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

bool
    Foo = true,
    Bar = false;

// etc.

您会注意到我也在花括号上使用了“=”符号。这似乎是大多数人编写代码的方式,所以我和我的祖父就是这样写的,以减少人们在阅读我们的代码时的困惑。我不知道这种方法在公司环境或组织中的接受度如何,我只是认为它是最有吸引力和最直观的风格。它还可以节省大量输入。

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

当使用赋值“=”时,在某些情况下,您最终会构造对象并为其赋予初始值,然后代码使用 class 类型的赋值运算符来更改初始值,所以效率较低。这仅在某些情况下,取决于可用的构造函数等。

然而,在大多数情况下,现代编译器可以对其进行优化,使其成为同一事物。所以不用担心。

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

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

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

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

参见说明部分的Reference

The copy constructor is called whenever an object is initialized (by direct-initialization or copy-initialization) from another object of the same type (unless overload resolution selects a better match or the call is elided), which includes initialization: T a = b; or T a(b);, where b is of type T;