16、在operator=中为所有的data members设定(赋值)内容
1、默认的assignment运算符与自定义的assignment运算符
在自定义一个class时,若没有声明assignment运算符,则编译器会为class产生一个缺省的assignment运算符。默认的assignment运算符,将会使得对象的每个数据成员都按照二进制值进行拷贝。
而有些时候,我们希望assignment运算符不完全按照默认的assignment运算符执行,如之前Effective_C++:11(
Effective_C++:11)中提到的,在class内有动态内存分配时,需要自定义assignment运算符,修改指针的拷贝方式,是将指针指向的变量内容进行拷贝。而其他不改变的部分,同样需要我们一一列出。因为若我们自定义了assignment运算符,编译器将不会再产生一个默认的assignment运算符。
2、在operator=中为所有的data members设定内容
当声明一个class时,撰写自定义的assignment运算,我们可以很容易的对所有的成员设定内容。
而当对class进行升级添加新成员时,亦要记得同步修改构造函数、assignment运算符。
然而,在涉及继承时,assignment运算符中所有的data members也包含基类的data members。即派生类的assignment运算符也需要处理基类数据成员的赋值操作。而很有可能基类数据成员是private,不能在派生类中直接进行赋值操作。因此:
1.一种方法是以派生类对象为参数调用基类的operator=(),完成派生类对象中基类数据成员的赋值操作。
而当对class进行升级添加新成员时,亦要记得同步修改构造函数、assignment运算符。
然而,在涉及继承时,assignment运算符中所有的data members也包含基类的data members。即派生类的assignment运算符也需要处理基类数据成员的赋值操作。而很有可能基类数据成员是private,不能在派生类中直接进行赋值操作。因此:
1.一种方法是以派生类对象为参数调用基类的operator=(),完成派生类对象中基类数据成员的赋值操作。
Base::operator=(rhs);//rhs为入参,const Dirived& rhs;
2.另一种方法是将*this转换为基类引用类型,调用assignment运算符完成基类数据成员的赋值操作。
static_cast<Base&>(*this) = rhs;//rhs为入参,const Dirived& rhs;
另外,此时,在拷贝构造函数中,同样需要完成基类数据成员的赋值操作,最好的办法是在成员初始化列表对基类数据进行初始化。