条款十二 复制对象时勿忘其每一个成分

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()函数,
这两个拷贝函数不要互相调用,这样不太好,应该把相同代码放到第三方函数中

 

posted @ 2012-07-29 10:29  bizhu  阅读(330)  评论(0编辑  收藏  举报