C++11变量初始化和声明

3
使用C++11,出现了一种新的变量初始化和声明方式。
int c_derived = 0;

C++11

int modern{0};

每种方法的优缺点是什么?为什么要实现新的方法?编译器是否有不同的操作?


C++11的新特性可能会令人困惑,因为它看起来类似于函数声明! - Kaustav Ray
我认为你的意思是 int modern{0}; - mpark
1
这个在C++11之前就存在了。花括号是后来添加的。 - chris
使用易读的方式:int x = 0 - Bryan Chen
好的。谢谢。我正在阅读的书上用的是()而不是大括号,并且说这是新的。 - Andrue
“现代”方法更“现代”,因此一定更好。 - Pete Becker
2个回答

8
你误解了--int modern(0)形式(使用圆括号)在旧版本的C++中可用,并且在C++11中仍然可用。
在C++11中,新的形式使用花括号提供统一初始化,因此您可以这样说:
int modern{0};

这种新表单的主要优点在于它可以在任何地方保持一致使用。它清楚地表明您正在初始化一个新对象,而不是调用函数或更糟糕的是声明一个
它还提供了与C样式(“聚合”)结构初始化的语法一致性,形式如:
struct A
{
    int a; int b;
};

A a = { 1, 2 };

当使用花括号形式时,数值类型的缩小转换也有更严格的规则。

好的。我正在阅读的书使用()而不是{}。这更多是个人偏好还是int A = 1;将来会被弃用?我应该转换到新方法吗? - Andrue
1
我不这么认为。我认为C++11花括号初始化的最大优势是它可以调用默认构造函数。因此,基本类型的初始化使用等号(=)将永远不会被弃用。 http://www.informit.com/articles/article.aspx?p=1852519 - hyun
1
使用花括号也可以避免缩小转换:http://www.stroustrup.com/C++11FAQ.html#narrowing - pamplemousse_mk2

3

使用大括号只是为了在C++11中引入通用初始化。

现在可以使用大括号来初始化数组、变量、字符串和向量。


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