我有一个基本的 C++ 问题,我真的应该知道答案。
假设我们有一些带有构造函数A(int a)
的类A
。有什么区别:
A test_obj(4);
和
A test_obj = A(4);
?
我通常使用后一种语法,但在我可信赖的 C++ 初级读物中查找一些不相关的内容后,我意识到他们通常使用前者。这两者之间的区别经常在内置类型的上下文中讨论(例如 int a(6)
vs int a = 6
),我的理解是这种情况下它们是等价的。
但是,在用户定义类的情况下,这两种定义对象的方法是等价的吗?或者后一种选择是先默认构造test_obj
,然后使用A
的拷贝构造函数将A(4)
的返回值赋值给测试对象
?如果是第二种可能性,我想这两种方法对于大类可能会有一些性能差异。
我敢肯定这个问题在互联网上的某个地方得到了回答,即使在这里,但如果没有找到询问第一个选项和使用 new
之间区别的问题,我就无法有效地搜索它,which是无关的。
最佳答案
A test_obj = A(4);
在概念上确实构造了一个临时的 A
对象,然后从中复制/移动构造 test_obj
临时的,然后销毁临时的。
但是这个过程是copy elision的候选过程这意味着在验证复制/移动构造函数存在且可访问后,允许编译器将其视为 A test_obj(4);
。
从 C++17 开始,编译器将强制执行此操作;在此之前它是可选的,但通常编译器会这样做。
关于c++ - C++中类对象的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41387680/