在C++中创建类对象

Class object creation in C++

本文关键字:对象 创建 C++      更新时间:2023-10-16

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

假设我们有一些带有构造函数A(int a)的类A。两者之间有什么区别:

A test_obj(4);

A test_obj = A(4);

我通常使用后一种语法,但在我可靠的C++入门中查找了一些不相关的语法后,我意识到他们通常使用前者。这两者之间的区别通常在内置类型的上下文中讨论(例如int a(6)vsint a = 6),我的理解是在这种情况下它们是等效的。

但是,对于用户定义的类,定义对象的两种方法是否等效?还是后一个选项首先默认构造test_obj,然后使用A的复制构造函数将返回值A(4)分配给test_obj?如果是第二种可能性,我想对于大型类,这两种方法之间可能存在一些性能差异。

我相信这个问题在互联网上的某个地方得到了回答,甚至在这里,但是如果不找到询问第一个选项和使用new之间区别的问题,我就无法有效地搜索它,这是不相关的。

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

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

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

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

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