Почему не вызывается конструктор копирования класса-члена? - PullRequest
2 голосов
/ 31 марта 2010
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

Ответы [ 4 ]

16 голосов
/ 31 марта 2010

Поскольку вы не вызывали конструктор копирования member. Вам необходимо явно копировать элементы, если вы переопределяете конструктор копирования по умолчанию fred.

fred(const fred& other) : member_(other.member_) {
    cout<<"Calling fred copy constr"<<'\n';
}
6 голосов
/ 31 марта 2010

Он не вызывается, потому что вы явно попросили компилятор не вызывать его. Когда вы определили свой собственный конструктор копирования для класса fred, вы по существу сказали компилятору, что хотите взять дело в свои руки и выполнить копирование самостоятельно. Поскольку вы ничего не делаете для копирования member_ в конструкторе копирования fred, он не копируется.

Если вы избавитесь от явного определения конструктора копирования fred, компилятор предоставит вам неявный, который вызовет конструктор копирования member для копирования member_.

Если вы настаиваете на том, чтобы самостоятельно определить конструктор копирования fred, вы должны скопировать member_ самостоятельно, как предложил KennyTM.

0 голосов
/ 31 марта 2010

Вы должны явно назвать это в этом случае. Потому что у вас перегружены конструкторы.

Кстати, когда я вижу «Фред», это напоминает мне этот полезный ресурс, пожалуйста, поищите дальнейшее понимание конструкторов C ++: http://www.parashift.com/c++-faq-lite/ctors.html

0 голосов
/ 31 марта 2010

Если класс A имеет член класса B, и вы явно реализуете ctor копирования для класса A, то вы должны явно скопировать туда членов, в этом случае вызвать ctor копирования B, в противном случае член B будет создан по умолчанию, а не копия построена.

...