C++理解复制构造函数

Raf*_*ssi 2 c++

有一些我无法理解的东西.看看这种主要:

class C {
 public:
  C() { cout << "C0 "; }
  C(const C&) { cout << "Cc"; }
};

class D {
 public:
  C c;
  D() { cout << "D0 "; }
  D(const D&) { cout << "Dd"; }
};

int main() {

  D x; cout << endl;
  D y(x); cout << endl;
  return 0;

}

//output is:
C0 D0
C0 Dd
Run Code Online (Sandbox Code Playgroud)

我同意这一事实D x给出C0 D0的输出,因为在d类存在于默认的构造函数的调用C,然后该对象D被创建.

D y(x)就像D y = x在哪里(像之前一样)创建C(所以输出C0)并调用复制构造函数.为什么不Cc出现?如果您考虑以下代码:

class C {
 public:
  C() { cout << "C0 "; }
  C(const C&) { cout << "Cc"; }
};

class D {
 public:
  C c;
  D() { cout << "D0 "; }
};

int main() {

  D x; cout << endl;
  D y(x); cout << endl;
  return 0;

}

//output is:
C0 D0
Cc
Run Code Online (Sandbox Code Playgroud)

为什么现在输出Cc

该代码是,除了一个事实,即没有对D的拷贝构造函数的说,一个定义等于D y(x)D y = x我期望像以前一样创建(调用默认的构造函数,以便输出Ç C0),然后没有文字,因为D(const D&)定义.

也许我误解了复制构造函数.在这种情况下他们怎么称呼?

joe*_*ing 6

在第一种情况下,D Copy构造函数需要显式调用C复制构造函数.

D(const D &d) :  c(d.c) 
{ cout << "Dd"; }
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,由于您没有定义D copy-ctor,编译器会为您生成一个.

为了更清楚,在C和D中添加一个额外的int.

static int counter;
class C {
 public:
  int index;
  C() { index = ++counter; cout << "C0 "; }
  C(const C&) { index = c.counter; cout << "Cc"; }
};

class D {
 public:
  int dcounter;
  C c;
  D() { dcounter = ++counter; cout << "D0 "; }
  D(const D&) : dcounter(D.dcounter)
{ cout << "Dd"; }
};
Run Code Online (Sandbox Code Playgroud)

现在,使用调试器逐步执行,或添加更多printfs().当你做D y(x)时,你会看到y中的成员c没有被复制 - 只是构造了.