簡體   English   中英

C++ 復制構造函數和默認構造函數

[英]C++ copy Constructor and default constructor

我正在學習 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,看到它的公共 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構造函數(稍微重新格式化):

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

首先將調用A構造函數,因為它是C的基類。 這將打印A+

然后b1成員將被復制構造,由於B::a成員,它將首先打印A+ ,然后是B復制構造函數體中的B B(B)

然后b2成員將被默認構造,它將打印A+ (再次因為B::a成員),然后是B+

然后C構造函數體將運行,它將打印C+


C構造函數實際上與此等效(添加了注釋):

C(const B& b)
    : A(),      // Prints A+
      b1(b),    // Prints A+ and B(B)
      b2()      // Prints A+ and B+
{
    cout << "C+" << endl;    // Prints C+
}

希望這將使您更容易了解正在發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM