在C++中创建类对象
Class object creation in C++
我有一个基本的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
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针