[英]when "B c = a" why the output isnt : "cosntructor A\n constructor B\n copy constructor B"?
Output:
当B c = a
为什么 output 不是:
cosntructor A
constructor B
copy constructor B
代替
cosntructor A
copy constructor B
?
================================================ ======================================代码
class A {
public:
A(const A&);
A();
~A();
};
class B : public A {
public:
B(string, int, float, int);
B(const B&);
B();
~B();
};
A::A() { cout << "constructor A\n"; }
A::A(const A& old_str) { cout << "copy constructor A\n"; }
A::~A() { cout << "destructor A\n"; }
B::B() { cout << "constructor B\n"; }
B::B(const B& old_str) { cout << "copy constructor B\n"; }
B::~B() { cout << "destructor B\n"; }
int main()
{
B a;
cout << "\n\n\n";
B c = a;
cout << "\n\n\n";
}
我不明白什么时候 c 的“B c = a”没有被称为 A 和 B 的两个构造函数。对于 B c,output 是构造函数 A 构造函数 B,这很好,为什么“B c = a”不一样“
您看不到打印的“复制构造函数 A”,因为您没有在B
复制构造函数中复制构造A
基数。 您可以在成员初始化器列表中执行此操作。
B::B(const B& other) : A(other) { cout << "copy constructor B\n"; }
在这份声明中
B c = a;
这里使用了用户定义的class B的拷贝构造函数。
B::B(const B& old_str) { cout << "copy constructor B\n"; }
复制构造函数隐式调用基类 class A 的默认构造函数来创建其基类 class 子对象。 结果你有
cosntructor A
copy constructor B
实际上class B的拷贝构造函数
B::B(const B& old_str) { cout << "copy constructor B\n"; }
相当于
B::B(const B& old_str) : A() { cout << "copy constructor B\n"; }
你感到困惑的原因是你似乎认为在这份声明中
B c = a;
首先使用 class B
的默认构造函数创建 object c
然后使用另一个构造函数:复制构造函数将 object a
分配给创建的 object c
。
然而,只有一个构造函数可以用于创建 object,在这种情况下,使用了 class B 的复制构造函数。
在这份声明中
B c = a;
没有任务。 a
是初始化创建的 object c
的初始化程序。 您也可以通过以下方式重写此声明,使其更加清晰
B c( a );
当 B c = a 为什么 output 不是:
因为B c = a;
是复制初始化。 这意味着c
被创建为 object a
的副本,使用复制构造函数B::B(const B&)
。 因此,由于语句B c = a;
复制构造函数B::B(const B&)
被编译器隐式调用。 . 现在,在进入B
的这个复制构造函数的主体之前,默认构造函数A::A()
也被隐式调用。 因此你得到 output:
constructor A
copy constructor B.
另一方面, B a;
是使用默认构造函数B::B()
的默认初始化。 因此默认构造函数B::B()
由于语句B a;
而被隐式调用。 . 但是在进入B
的默认构造函数体之前,默认构造函数A::A()
也被隐式调用。 因此你得到 output:
constructor A
constructor B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.