繁体   English   中英

当“B c = a”时,为什么 output 不是:“构造函数 A\n 构造函数 B\n 复制构造函数 B”?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM