为什么不调用成员类的复制构造函数?

san*_*eep 2 c++ copy-constructor

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
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 16

因为你没有调用member复制构造函数.如果覆盖默认的复制构造函数,则需要显式复制成员fred.

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


AnT*_*AnT 6

它未被调用,因为您明确要求编译器不要调用它.当你为类定义自己的拷贝构造函数时fred,你基本上告诉编译器你想要把事情掌握在自己手中并自己进行复制.既然你什么都不做复制member_fred的拷贝构造函数,它是不可复制的.

如果你摆脱了fred复制构造函数的显式定义,编译器将为你提供一个隐式的,它将调用member复制构造函数进行复制member_.

如果你坚持fred自己定义复制构造函数,就必须member_像KennyTM建议的那样复制自己.