c++ - 为什么不调用复制构造函数?

标签 c++ copy-constructor

class MyClass
{
public:
  ~MyClass() {}
  MyClass():x(0), y(0){} //default constructor
  MyClass(int X, int Y):x(X), y(Y){} //user-defined constructor
  MyClass(const MyClass& tempObj):x(tempObj.x), y(tempObj.y){} //copy constructor

private:
  int x; int y;
};

int main()
{
  MyClass MyObj(MyClass(1, 2)); //user-defined constructor was called.
  MyClass MyObj2(MyObj); //copy constructor was called.
}

在第一种情况下,当 MyClass(1, 2) 调用用户定义的构造函数并返回一个对象时,我期望 MyObj 调用复制构造函数。为什么不需要为 MyClass 的第二个实例调用复制构造函数?

最佳答案

当临时对象被创建的唯一目的是被复制并随后被销毁时,编译器可以完全删除临时对象并直接在接收者中构造结果(即直接在应该接收的对象中)复制)。你的情况

MyClass MyObj(MyClass(1, 2));

可以转化为

MyClass MyObj(1, 2);

即使复制构造函数有副作用。

这个过程称为复制操作的省略。在语言标准的 12.8/15 中有描述。

关于c++ - 为什么不调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663506/

相关文章:

c++ - 使用shared_ptr而不是unique_ptr作为类成员只是为了避免隐式复制构造函数删除是否明智?

c++ - 迭代器是静态指针吗?

c++ - 更自然的 boost::bind 替代方案?

c++ - 复制构造函数演示(崩溃...)

c++ - 复制构造函数错误 : the object has type qualifiers that are not compatible with the member function

c++ - 为什么编译器在调用 move 后选择复制 ctor

c++ - 重载 = 运算符和名称隐藏

c++ - Do-while 循环不会退出 C++

C++ 模板数组运算符 [] 使用整数

C++ 复制构造函数 - 小而重要的区别