簡體   English   中英

為什么不調用成員類的復制構造函數?

[英]Why isnt the copy constructor of member class called?

class member
{
public:
    member()
    {
       cout<<"Calling member constr"<<'\n';
    }
    member(const member&)
    {
        cout<<"Calling member copy constr"<<'\n';
    }
};

class fred
{
public:
    fred()
    {
        cout<<"calling fred constr"<<'\n';
    }
    fred(const fred &)
    {
        cout<<"Calling fred copy constr"<<'\n';
    }
protected:
    member member_;
};

int main()
{
    fred a;
    fred b=a;
}

Output:
Calling member constr
calling fred constr
**Calling member constr**
Calling fred copy constr

因為你沒有調用member的復制構造函數。 如果覆蓋fred的默認復制構造函數,則需要顯式復制成員。

fred(const fred& other) : member_(other.member_) {
    cout<<"Calling fred copy constr"<<'\n';
}

它未被調用,因為您明確要求編譯器不要調用它。 當你為類fred定義了自己的拷貝構造函數時,你基本上告訴編譯器你想要把事情掌握在自己手中並自己進行復制。 由於您沒有在fred的復制構造函數中復制member_ ,因此不會復制它。

如果你擺脫了fred的拷貝構造函數的顯式定義,編譯器將為你提供一個隱式的,它將調用member的拷貝構造函數來復制member_

如果你堅持自己定義fred的拷貝構造函數,你必須自己復制member_ ,正如KennyTM建議的那樣。

如果類A具有類B成員並且您明確地為類A實現了副ctor,則必須顯式復制那里的成員,在這種情況下調用B copy ctor,否則B成員將是默認構造的,而不是復制構造。

在這種情況下,您必須明確地調用它。 因為,你有重載的構造函數。

順便說一句,當我看到“Fred”時,它會讓我想起這個有用的資源,請進一步了解C ++構造函數: http//www.parashift.com/c++-faq-lite/ctors.html

暫無
暫無

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

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