C ++中的类对象创建

时间:2016-12-29 21:51:11

标签: c++ class object

我有一个基本的C ++问题,我真的应该知道答案。

假设我们有一些带有构造函数buffer.toJSON()的类A。有什么区别:

A(int a)

A test_obj(4);

我通常使用后一种语法,但在查找了我可信赖的C ++入门中不相关的内容后,我意识到它们通常使用前者。这两者之间的差异通常在内置类型的上下文中讨论(例如A test_obj = A(4); vs int a(6)),我的理解是在这种情况下它们是等价的。

但是,在用户定义的类的情况下,定义对象等效的两种方法是什么?或者后一个选项是否首先默认构建int a = 6,然后使用test_obj的复制构造函数将A的返回值分配给A(4)?如果这是第二种可能性,我想两种方法对于大型课程可能会有一些性能差异。

我确定这个问题在互联网上的某个地方得到了解答,即使在这里,但我无法有效地搜索它,而没有找到问题,询问第一个选项与使用test_obj之间的区别,这是无关的。

2 个答案:

答案 0 :(得分:4)

A test_obj = A(4);在概念上确实构造了一个临时的A对象,然后从临时对象中复制/移动构造test_obj,然后破坏临时对象。

但是,此过程是copy elision的候选者,这意味着在验证复制/移动构造函数存在且可访问后,允许编译器将其视为A test_obj(4);

从C ++ 17开始,编译器必须这样做;在此之前它是可选的,但通常编译器确实这样做。

答案 1 :(得分:3)

在性能方面,即使您有copy elision规定的非标准复制构造函数,这些也是等效的。这是自C ++ 17以来的保证,但即使在符合早期标准的编译器中也允许并广泛存在。

自己尝试,关闭所有优化并将标准强制转换为C ++ 11(或C ++ 03,更改右上角的命令行): https://godbolt.org/g/GAq7fi