我在一个 c++ 文件中遇到了这种语法:
Obj obj = {};
它有什么作用?它只是调用默认构造函数吗?
我在一个 c++ 文件中遇到了这种语法:
Obj obj = {};
它有什么作用?它只是调用默认构造函数吗?
表达式周围的大括号表示值的聚合,并{}
表示一个空的值列表。
是{}
的,只需调用默认构造函数。(它还确保所有成员都以某种方式初始化,即使该类没有提供默认构造函数。这称为“值初始化”。)
在 C++11 之前,它将对所有成员使用具有默认值的聚合初始化。但是,这已经与值初始化相同,即“调用默认构造函数”的行为。(事实上,值初始化是 C++03 发明的一个概念,它允许面向构造函数的语法表示已经存在于聚合类型中的东西。)
有一个小怪癖:它不会调用默认构造函数声明explicit
,而是产生错误。解决方案是永远不要声明explicit
默认构造函数。如果你被这样一个构造函数卡住了,去掉=
并说Obj obj{}
.
这种初始化形式在 C++11 中称为列表初始化,在 C++14 中称为复制列表初始化。它等效于直接列表初始化 Obj obj{};
(在 C++14 语言中),前提是所需的构造函数是 non- explicit
,它只是对对象进行值初始化。
(这具体意味着什么取决于Obj
是基本类型还是类类型,以及为它声明了什么样的构造函数。)
对于 C,此空语法{}
无效。对于有效的初始化程序,您至少需要一个字段值。C 标准将其推广{ 0 }
为一个通用的从零开始的初始化器,它等同于 C++ 的{}
.