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

标签 c++ class constructor derived-class

我正在学习 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+ 然后返回 B 并打印 B+。就是这样,B b;C c(b) 它转到 C,看到它的公共(public) A 转到 A 并打印 A+ 然后返回看到我们有一个成员 B b1,b2 转到 B,B 有一个成员 A,然后转到 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-

关于C++ 复制构造函数和默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59966443/

相关文章:

c++ - "argument type for %p format specifier is "void*”是什么意思?

c++ - 是否可以在非托管代码中使用 Mock/Fake 框架?

c# - 可以在类中存储 LINQ 查询吗?

c# - 我们是否使类的对象具有私有(private)构造函数?

javascript - Javascript继承对象需要 "Subclass.prototype.constructor = Subclass"吗?

C++ 序列化 : overloading insert operator with write()

c++ - 使用拷贝构造函数有什么好处?

java - 如何检索 Java 反射的子类?

PHP5 OOP 类结构

javascript - 在 Javascript 中设置模块的原型(prototype)