当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Objectobj=Object()和Objectobj()有什么区别?》经验,为你挑选了4个好方法。

我认为它有很多关于它的信息,但我不知道这是怎么称呼的.我无法理解下两个代码串之间的区别:

Object obj();

Object obj = Object();

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



1> vladon..:
Object obj();

它不是对象的实例化,它是一个函数的声明,obj它不接受任何参数并返回一个实例Object.

Object obj;

是一个default initialization,即使用隐式构造函数实例化(因此,默认隐式构造函数或explicit没有参数的用户定义的非构造函数),并且此声明调用非POD Object成员的隐式构造函数,对于POD类型,它不初始化它们(它们不会被归零).这适用Object于递归等成员等.

Object obj{};

列表初始化聚合初始化(如果Object是聚合).那些调用不同,对于空括号,行为是相同的:POD类型的所有成员都是零初始化的,非POD是默认初始化的.

Object obj = Object();

理论上是一个两步声明:1)创建临时Object实例; 2)然后通过复制构造函数/移动构造函数/复制运算符/移动运算符构造obj.但在实践中,它将默认构建为copy/move-elision(默认情况下,即使所有优化都关闭,它也会在所有现代编译器上启用,您必须明确禁用elision).最好不要使用这个变种.

预结论

选择

Object obj;

要么

Object obj{};

如果您想要快速初始化而不将其POD成员置零,请先选择.如果你想确保在实例化后它的所有POD成员都为零,则选择第二个Object.

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

所以...

结论

使用值初始化:

Object obj{};

除非您需要在异国情调的系统上进行实时演出.


@vladon:在转换成本方面存在很多开销,许多公司仍然因为各种原因而被迫使用遗留代码.当然,如果由我决定,我会使用最新最好的一切,但我们并不总是可以这样做,特别是在已存在超过十年的大公司.我使用C++ 11样式代码不止一次遇到麻烦,这些代码在我的项目中有效但不会为其他使用旧编译器使用相同文件的团队编译.只想指出并非所有人都有这样的选择.

2> aschepler..:
Object obj();

声明一个函数,而不是一个对象!这是"最令人烦恼的解析"的一个例子.

Object obj = Object();

需要Object有一个可访问的移动构造函数或复制构造函数(尽管编译器最终可能会忽略移动/复制).

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

Object obj;
Object obj{};


`Object obj;`和`Object obj {};`是不同的.

3> NathanOliver..:
Object obj();

声明一个obj返回a Object且不带参数的函数名.这通常不是你想要的.

Object obj = Object();

声明一个Object名为objthen然后使用临时默认构造初始化的副本Object.除非您将对象重置为默认状态,否则通常不希望这样做.

通常,如果您想在不调用构造函数的情况下构造,则可以使用

Object obj;
//or
Object obj{};


`Object obj {};`是值启动,而不是默认初始化.在某些情况下,这可能会有所不同.

4> Bathsheba..:

很大的区别.

第一个是函数原型,函数不带参数并返回一个Object.

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

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


第二个复制/移动构造一个临时的`obj`.这是不同的,因为如果对象不是MoveConstructible,它将无法编译.此外,如果它是可移动的,它可能与`Object obj;'具有不同的行为,尽管实际编写具有不同行为的代码会被认为是不好的风格.
推荐阅读
放ch养奶牛
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有