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

What's difference between Object obj = Object() and Object obj()?

本文关键字:Object obj 区别 什么      更新时间:2023-10-16

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

Object obj();

Object obj = Object();

你能解释一下吗?或者至少说一下如何称呼它。

Object obj();

不是对象的实例化,它是函数obj声明,该函数不接受参数并返回Object的实例。

Object obj;

default initialization,即使用隐式构造函数实例化(因此,默认隐式构造函数或用户定义的无参数非explicit构造函数),并且此声明调用非POD Object成员的隐式构造函数,对于POD类型,它不初始化它们(它们不会被置零)。这对于Object的成员的成员来说是正确的,依此类推。

Object obj{};

列表初始化聚合初始化

Object obj = Object();

理论上是两步走的:1)创建临时Object实例;2) 然后通过复制构造函数/move构造函数/copy运算符/move运算符构造obj。但在实践中,它将是在考虑复制/移动省略的情况下默认构建的(默认情况下,在所有现代编译器上都会启用它,即使关闭了所有优化,也必须显式禁用省略)。最好不要使用这种变体。

结论前

选择

Object obj;

Object obj{};

如果您想要快速初始化而不归零其POD成员,请选择第一个。如果您想确保Object实例化后其所有POD成员都为零,请选择第二个。

实际上,在首次从其成员读取之前,这两种变体在所有现代操作系统上的运行时速度相同。

所以。。。

结论

使用值初始化:

Object obj{};

除非您需要在奇异系统上的实时性能。

Object obj();

声明的是函数,而不是对象!这是"Most Vexing Parse"的一个例子。

Object obj = Object();

要求Object具有可访问的移动构造函数或复制构造函数(尽管编译器最终可能会删除移动/复制)。

创建对象的简单方法包括:

Object obj;
Object obj{};
Object obj();

声明一个名为obj的函数,该函数返回一个Object并且不接受任何参数。这通常不是你想要的。

Object obj = Object();

声明一个名为objObject,然后使用临时默认构造的Object进行复制初始化。除非将对象重置回默认状态,否则通常也不希望执行此操作。

一般来说,如果你想在不调用构造函数的情况下进行构建,你可以使用

Object obj;
//or
Object obj{};

差异很大。

第一个是一个不带参数并返回Object的函数原型。

第二个通过调用默认构造函数来实例化对象。为避免疑义,不调用赋值运算符。

去掉第一种情况下的括号,使语句等效。