Effective_C++:16、在operator=中为所有的data members设定(赋值)内容

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=(),完成派生类对象中基类数据成员的赋值操作。
Base::operator=(rhs);//rhs为入参,const Dirived& rhs;
        2.另一种方法是将*this转换为基类引用类型,调用assignment运算符完成基类数据成员的赋值操作。
static_cast<Base&>(*this) = rhs;//rhs为入参,const Dirived& rhs;
        另外,此时,在拷贝构造函数中,同样需要完成基类数据成员的赋值操作,最好的办法是在成员初始化列表对基类数据进行初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章