如何触发数据成员的复制构造函数?

Bog*_*hai 1 c++ oop constructor copy-constructor

我试过这个:

class cls1{
    public:
    cls1(){ cout << "cls1 constructor\n";}
    cls1 (cls1 & o){ cout << "cls1 copy constructor\n";}
};

class cls2{
public:
    cls2 () { cout << "cls2 constructor\n";}
    cls2 (cls2 & o){ cout << "cls2 copy constructor\n";}
};

class my_cls{ 
public: 
    cls1 o1;
    cls2 o2;
    my_cls(){ cout << "my_cls constructor\n";}
    my_cls(my_cls& o){ cout << "my_cls copy constructor\n";}    
};    

void f(my_cls o){}

int main(){
    my_cls p;
    f(p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但输出是:

cls1 constructor
cls2 constructor
my_cls constructor
cls1 constructor
cls2 constructor 
my_cls copy constructor
Run Code Online (Sandbox Code Playgroud)

我发现这令人困惑,因为我被告知,对于每个成员,复制构造函数在进行逐位复制时调用该成员的复制构造函数,execpt用于premitive类型.(我希望在my_cls的复制构造函数之前调用cls1和cls2的复制构造函数)

Pio*_*ycz 5

你被告知只有编译器生成的复制构造函数才适用.

如果要编写自己的复制构造函数,则需要在初始化列表中放置成员和基类的复制c-tors,否则将使用它们的默认c-tors.

在您的示例中缺少: o1(o.o1), o2(o.o2):

der (der & o)
: o1(o.o1)
, o2(o.o2)
{ cout << "my_cls copy constructor\n";}  
Run Code Online (Sandbox Code Playgroud)