C ++复制构造函数和默认构造函数

年轻的一切

我正在学习c ++,并且发现了我不太了解的输出。

#include <iostream>
using namespace std;

class A{
    public:
        A(){ cout << "A+" << endl;}
        A(const A&){ cout << "A(A)" << endl;}
        ~A(){cout << "A-" << endl;}
};

class B{
    public:
        B(){ cout << "B+" << endl;}
        B(const B&){cout << "B(B)" << endl;}
        ~B(){cout << "B-" << endl;}
    private:
        A a;
};

class C : public A{
    public:
        C(const B& b) : b1(b) { cout << "C+" << endl;}
        ~C(){ cout << "C-" << endl;}
    private:
        B b1,b2;
};

void test(A a){
    A m(a);
}

int main(){
    B b;
    C c(b);
    test(c);
    return 0;

}

输出是

A+
B+
A+
A+
B(B)
A+
B+
C+
A(A)
A(A)
A-
A-
C-
B-
A-
B-
A-
A-
B-
A-

我的意思是第一个,B进入默认状态,看到a我们从类型A获得了一个成员,然后进入A,多数民众赞成,A+然后返回B并打印B+这就是它与B b;C c(b)它转到C,看它的公共前进到A和打印A +比追溯到看到我们得到了一个部件B B1,B2进入B和B有成员的,去爱琴海A和打印A+和比我不明白为什么B(B)?在这个B(B)之后,我什么都不懂。.我尝试调试它,但是对我没有太大帮助,也许有人可以解释为什么这样工作?

来自莫斯科的弗拉德

如果我已正确理解您的问题,则您正在尝试理解输出

A+
A+
B(B)
A+
B+
C+

与此声明相对应

C c(b);

C类具有A类基础

class C : public A{

因此,类A的构造函数称为

A+

然后创建数据成员b1

C(const B& b) : b1(b) { cout << "C+" << endl;}

B类又具有数据成员A

class B{
    public:
        B(){ cout << "B+" << endl;}
        B(const B&){cout << "B(B)" << endl;}
        ~B(){cout << "B-" << endl;}
    private:
        A a;
};

因此,当调用类B的副本构造函数时,将a创建数据成员

A+
B(B)

类C具有类B的另一个数据成员。它是数据成员b2。所以这些构造函数称为

A+
B+

最后,构造函数C的主体得到控制

C+

析构函数以与创建对象的顺序相反的顺序获得控件。

因此,对象的析构函数输出c如下所示

C-
B-
A-
B-
A-
A-

您可以通过少量更改使程序输出更加清晰。

例如

#include <iostream>
using namespace std;

class A{
    public:
        A(){ cout << "A+" << endl;}
        A(const A&){ cout << "A(A)" << endl;}
        ~A(){cout << "A-" << endl;}
};

class B{
    public:
        B() : i( n++ ) { cout << "B+" << ' ' << i << endl;}
        B(const B&) : i( n++ ) {cout << "B(B)" << ' ' << i << endl;}
        ~B(){cout << "B-" << ' ' << i << endl;}
    private:
        size_t i;
        static size_t n;
        A a;
};

size_t B::n;

class C : public A{
    public:
        C(const B& b) : b1(b) { cout << "C+" << endl;}
        ~C(){ cout << "C-" << endl;}
    private:
        B b1,b2;
};

void test(A a){
    A m(a);
}

int main(){
    B b;

    std::cout << '\n';

    C c(b);

    std::cout << '\n';

    test(c);

    std::cout << '\n';
}

此更新程序的程序输出为

A+
B+ 0

A+
A+
B(B) 1
A+
B+ 2
C+

A(A)
A(A)
A-
A-

C-
B- 2
A-
B- 1
A-
A-
B- 0
A-

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章