为什么复制构造函数也没有在最后一行调用?

时间:2014-07-12 12:31:16

标签: c++ constructor

这是一个具有3个不同构造函数的类定义,一个默认构造函数,一个参数化整数和一个复制构造函数。 R值对象在创建后立即创建和操作。前两种情况按预期工作,但在最后一种情况下,预计会进行两次构造函数调用,但只会发生第一次。为什么这样?以下是代码。

#include <iostream>

using namespace std;

class A
{
  int i;
public:
  A() {cout << "In default ctor\n";};
  A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;}
  A(const A& o) {cout << "In copy ctor, changing i to " << o.i << "\n"; i=o.i;}
  void print() {cout << "i = " << i << endl;}
};

int main()
{
  A o(10);

  A(o).print(); // invokes copy constructor A(const A&) as expected
  A(20).print(); // invokes int parametrized constructor A(int)
  A(A(30)).print(); // invokes only int constructor A(int) and not copy constructor, why         so?

  return(0);
}

输出结果为:

Setting i in par-ctor to 10
In copy ctor, changing i to 10
i = 10
Setting i in par-ctor to 20
i = 20
Setting i in par-ctor to 30
i = 30

1 个答案:

答案 0 :(得分:4)

C ++标准明确允许编译器在某些情况下省略副本。这被称为复制省略。其中一种情况如你所示:

  

当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动目标

请注意,复制省略是可选的。你的编译器恰好像A(30).print();那样处理那一行,但它没有。{/ p>