有一些我无法理解的东西.看看这种主要:
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&)是不定义.
也许我误解了复制构造函数.在这种情况下他们怎么称呼?
在第一种情况下,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没有被复制 - 只是构造了.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |