1

我在一个 c++ 文件中遇到了这种语法:

Obj obj = {};

它有什么作用?它只是调用默认构造函数吗?

4

3 回答 3

6

表达式周围的大括号表示值的聚合,并{}表示一个空的值列表。

{}的,只需调用默认构造函数。(它还确保所有成员都以某种方式初始化,即使该类没有提供默认构造函数。这称为“值初始化”。)

在 C++11 之前,它将对所有成员使用具有默认值的聚合初始化。但是,这已经与值初始化相同,即“调用默认构造函数”的行为。(事实上​​,值初始化是 C++03 发明的一个概念,它允许面向构造函数的语法表示已经存在于聚合类型中的东西。)

有一个小怪癖:它不会调用默认构造函数声明explicit,而是产生错误。解决方案是永远不要声明explicit默认构造函数。如果你被这样一个构造函数卡住了,去掉=并说Obj obj{}.

于 2015-07-21T09:02:04.627 回答
4

这种初始化形式在 C++11 中称为列表初始化,在 C++14 中称为复制列表初始化。它等效于直接列表初始化 Obj obj{};(在 C++14 语言中),前提是所需的构造函数是 non- explicit,它只是对对象进行值初始化。

(这具体意味着什么取决于Obj是基本类型还是类类型,以及为它声明了什么样的构造函数。)

于 2015-07-21T09:01:39.557 回答
1

对于 C,此空语法{}无效。对于有效的初始化程序,您至少需要一个字段值。C 标准将其推广{ 0 }为一个通用的从零开始的初始化器,它等同于 C++ 的{}.

于 2015-07-21T09:31:07.833 回答