Object obj = Object()和Object obj()有什么区别?

时间:2015-12-21 20:05:43

标签: c++

我认为它有很多关于它的信息,但我不知道如何调用它。我无法理解下两行代码之间的区别:

Object obj();

Object obj = Object();
你可以解释一下吗?或至少说如何称呼它。

4 个答案:

答案 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。为避免疑义,不调用赋值运算符。

在第一种情况下删除括号以使语句等效。