c++ - C++中类对象的创建

标签 c++ class object

我有一个基本的 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/

相关文章:

c++ - 基类的静态成员函数可以调用派生类对象吗? (C++)

c++检测用户是否输入了字符串而不是Int

python - 在python中将信息从一个实例发送到另一个具有特定名称的实例

javascript - 防止对象函数内的事件覆盖 "this"

c++ - 如何将 C++ 链接到 OpenBlas?

c# - 将字符串数组从 C++ 传递到 C#

JQuery 获取父类中的类

javascript - 在 React 类之间传递数据不起作用

javascript - 在LiveCycle中,对象名称以#开头是什么意思?

javascript - 如何统计每种类型的实例数?