簡體   English   中英

基類和派生類中的復制構造函數

[英]copy constructor in base and derived class

我不明白兩件事:

1-在代碼1中定義對象d2時,調用了基類的默認構造函數和派生類的復制構造函數。但在代碼2中(派生類沒有復制構造函數)只調用了基類的復制構造函數!

為什么要復制基類的構造函數? 是否調用了派生類的構造函數?

2-有什么區別

 D d2 = d1 ; 

D d2;
d2 = d1;

在這個例子中? 這是什么原因?

代碼 1

//code 1
#include <iostream> 


using std::cout;
using std::endl;

///////////////////////////
class B
{
protected:
    int x;

public:
    B()
    {
        x = 4;
        cout << "default constructor of Base class " << endl;
    }

    B(int a)
    {
        x = a;
        cout << "parametric constructor of Base class" << endl;
    }

    B(const B &b)
    {
        x = b.x;
        cout << "copy constructor of Base class " << endl;
    }
};
////////////////////////////////////////////////////////////
class D : public B
{
private:
    int y;

public:
    D()
    {
        y = 5;
        cout << "default constructor of Derived class" << endl;
    }

    D(int k)
    {
        y = k;
        cout << "parametric constructor of Derived class" << endl;
    }
    D(D& copy)
    {

        cout << "copy constructor of Derived class" << endl;
    }


};
////////////////////////////////////////////////////////////
int main()
{
    D d1(3);

    D d2 = d1;

    return 0;
}

代碼 2

    //code 2
    #include <iostream> 


    using std::cout;
    using std::endl;

    ///////////////////////////
    class B
    {
    protected:
        int x;

    public:
        B()
        {
            x = 4;
            cout << "default constructor of Base class " << endl;
        }

        B(int a)
        {
            x = a;
            cout << "parametric constructor of Base class" << endl;
        }

        B(const B &b)
        {
            x = b.x;
            cout << "copy constructor of Base class " << endl;
        }
    };
    ////////////////////////////////////////////////////////////
    class D : public B
    {
    private:
        int y;

    public:
        D()
        {
            y = 5;
            cout << "default constructor of Derived class" << endl;
        }

        D(int k)
        {
            y = k;
            cout << "parametric constructor of Derived class" << endl;
        }
 /*     D(D& copy)
        {

            cout << "copy constructor of Derived class" << endl;
        }
 */     

    };
    ////////////////////////////////////////////////////////////
    int main()
    {
        D d1(3);

        D d2 = d1;

        return 0;
    }

問題 1

在“代碼 1”中,您為派生類定義了一個復制構造函數。 因此,編譯器不再為您創建一個。 由於您沒有在字段初始化列表中專門調用基構造函數,因此在派生類復制構造函數中,它所做的第一件事就是調用基類默認構造函數。

但是,在“代碼 2”中,由於您的派生類不再具有已定義的復制構造函數,因此編譯器會為您隱式創建一個復制構造函數。 看到這個問題 最重要的答案解釋了將調用基本復制構造函數。

問題2

這個鏈接

每當從同一類型的另一個對象初始化(通過直接初始化或復制初始化)對象時,都會調用復制構造函數(除非重載決議選擇了更好的匹配或調用被省略),其中包括

  • 初始化:T a = b; 或 T a(b);,其中 b 是 T 類型;

所以D d2 = d1; 調用D拷貝構造函數,而D d2; d2 = d1; D d2; d2 = d1; 調用D默認構造函數,然后調用D賦值運算符。

暫無
暫無

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

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