2012-09-27 38 views
5

同样,默认拷贝构造函数是否在所有成员上调用拷贝构造函数?例如,如果一个类有一个非POD成员像这样:默认赋值运算符是否对所有成员调用operator =?

class A 
{ 
    std::string str; 
}; 

...将默认的编译器生成的拷贝构造函数和赋值运算符的工作是否正确?他们会调用字符串的复制构造函数和operator=或者他们是否只是成员变量str的按位副本?

换句话说,是否有std::string成员意味着这个类需要的用户实现的拷贝构造函数和赋值运算符?

回答

5

是,编译器生成一个将正常工作。

但是,如果你实现你自己的,让他们空的,它不会。

如果你没有管理内存,您的所有成员提供正确的复制/分配/销毁,你不需要(也不应该)实现自己的拷贝构造函数/析构/赋值运算符。

换句话说,是否有一个std :: string成员意味着这个类需要一个用户实现的复制构造函数和赋值运算符?

没有,编译器生成的将很好地工作。

+0

“是的,编译器生成一个将正常工作。” - 即使是有const成员的类? –

+0

@spin_eight那么复制或分配甚至不会编译。 –

+3

@LuchianGrigore:其实,一个副本会编译。这项任务显然不会。 –

相关问题