声明时,初始化=操作,()操作都是调用拷贝构造函数,只有初始化完成后,=操作才是operator=,示例:
Type a;
Type b(a); // 拷贝构造函数
Type a;
Type b = a; // 拷贝构造函数
Type a;
Type b;
b = a; // operator=(Type&)
由于operator=和拷贝构造函数功能几乎一样,通常管理深拷贝成员,实现1个operator=就行
class Type
{
const Type& operator= (const Type& right)
{
if (this == &right)
return *this;
this->m_1 = right.m_1;
this->m_2 = right.m_2;
...
// 动态分配空间,复制独立一份数据,实现深拷贝
return *this;
}
Type(const Type& right)
{
// 可以跟operator=写一样代码,为了复用,直接调
*this = right;
}
};
当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝;另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享。智能指针在ATL里面常见,即句柄类。