条款十二 复制对象时勿忘其每一个成分
1.在类里涉及到对象拷贝的函数要复制类里每一个成分copy构造函数以及copy assignment操作符
如
class Test { private: string name; public: Test(const Test& rhs):name(rhs.name) {} Test& operator = (const Test& rhs) { name = rhs.name; return this; } };
这样如果类里再添加一个成员变量时,就得需要修改这两个函数,不然新成员不会被拷贝的新对象中,而且
编译器一般不会报错
2.在继承中,注意base类的拷贝
class derve:public Test { private: string derveStr; public: derve(const derve& rhs):derveStr(rhs.derveStr){} derve& operator = (const derve& rhs) { derveStr = rhs.derveStr; return this; } };
虽然继承类里看到了两个拷贝函数,但忘了base类的拷贝,继承类对象里也包含了base类的一份副本,所以继承类对象拷贝时也需要
拷贝base的副本,如果继承类里没有调用base 的拷贝函数,会使用default的拷贝函数,如上面的继承类,拷贝时使用的是base类的default
拷贝函数,则不能做到拷贝每个成分,在定义继承类的时候可以调用base类的自定义拷贝函数
class derve:public Test { private: string derveStr; public: derve(const derve& rhs):derveStr(rhs.derveStr),Test(rhs){} derve& operator = (const derve& rhs) { Test::operator = (rhs); derveStr = rhs.derveStr; return this; } };
3.如果两个拷贝函数有重复的代码,可以定义一个成员函数(如init()),将重复的代码放到这个成员函数中,然后拷贝函数再调用这个init()函数,
这两个拷贝函数不要互相调用,这样不太好,应该把相同代码放到第三方函数中