我认为它有很多关于它的信息,但我不知道如何调用它。我无法理解下两行代码之间的区别:
Object obj();
和
Object obj = Object();
你可以解释一下吗?或至少说如何称呼它。
答案 0 :(得分:49)
Object obj();
不是对象的实例化,它是函数obj
的声明,它不接受任何参数并返回Object
的实例。
Object obj;
是default initialization
,即使用隐式构造函数实例化(因此,默认隐式构造函数或用户定义的非explicit
没有参数的构造函数),此声明调用非POD的隐式构造函数{ {1}}成员,对于POD类型,它不会初始化它们(它们不会被归零)。这适用于Object
的成员,等等递归。
Object
是列表初始化或聚合初始化(如果Object obj{};
是聚合)。那些调用不同,对于空括号,行为是相同的:POD类型的所有成员都是零初始化的,非POD是默认初始化的。
Object
理论上是一个两步语句:1)创建临时Object obj = Object();
实例; 2)然后通过复制构造函数/移动构造函数/复制操作符/移动操作符构造obj。但在实践中,它将默认构建为copy / move-elision(默认情况下,即使所有优化都关闭,它也会在所有现代编译器上启用,您必须明确禁用elision)。最好不要使用这种变体。
<强>预结论强>
选择
Object
或
Object obj;
如果您想要快速初始化而不将其POD成员置零,请先选择。
如果要确保在Object obj{};
实例化后其所有POD成员都为零,请选择第二个。
实际上,在第一次从其成员中读取之前,这两种变体在运行时在所有现代操作系统上具有相同的速度。
因此...
<强>结论强>
使用值初始化:
Object
除非您需要在异国情调的系统上进行实时演出。
答案 1 :(得分:31)
Object obj();
声明一个函数,而不是一个对象!这是“最令人烦恼的解析”的一个例子。
Object obj = Object();
要求Object
具有可访问的移动构造函数或复制构造函数(尽管编译器最终可能会忽略移动/复制)。
创建对象的简单方法包括:
Object obj;
Object obj{};
答案 2 :(得分:21)
Object obj();
声明函数名obj
,返回Object
并且不带参数。这通常不是你想要的。
Object obj = Object();
声明名为Object
的{{1}},然后使用临时默认构造的obj
进行初始化。除非您将对象重置为默认状态,否则通常不想这样做。
通常,如果你想在不调用构造函数的情况下构造,可以使用
Object
答案 3 :(得分:8)
差异很大。
第一个是函数原型,它是一个不带参数并返回Object的函数。
第二个通过调用默认构造函数来实例化Object。为避免疑义,不调用赋值运算符。
在第一种情况下删除括号以使语句等效。