c++拷贝构造函数和赋值函数注意的地方

来源:互联网 发布:三菱plc编程软件手机版 编辑:程序博客网 时间:2024/06/10 14:02

运用Copy函数和Copy assignment函数进行赋值操作应该注意的两点:

1)      复制所有local成员变量

2)      调用所有基类内的适当的copying函数。

这里面有一个很可怕的规则:当你不用编译器默认的拷贝函数或者赋值函数时,编译器也不会对你自己写的这两个函数进行报警。所以必须要很谨慎和小心。

对于没有继承的类来说,写这两个函数一般注意指针类型的复制就可以了

Class Base{

Public:

   Base(Base& base);

   Base& operator=(const Base& base);

Private:

   char* name;

   int age;

};

Base& Base::operator=(const Base& base)

{

  if(strcmp(name,base .name) = = 0) return *this; //自我复制的检测

name = new char[strlen(base.name)+1];

strcpy(name,base.name);

return *this;

}

如果后来增加了一个int age,但operator=里面什么都没有做,编译器不会出错!!

还有一种是对于继承类:

Class SubBase : public Base

{

public:

   SubBase(SubBase& subbase);

   SubBase& operator=(const SubBase& subbase);

pirvate:

   int subage;

};

如果

SubBase::SubBase(SubBase &subbase)

subage(subbase . subage)          //这样做就够了吗?

{

}

SubBase& SubBase::operator=(const SubBase& subbase)

{

subage = subbase . subbase;  //这样做就够了吗?

return *this;

}

如果仅仅这样,就说明了当进行Coyp构造函数时,实际上真正赋值的对象只有子类SubBase类中的subbase;而基类里面并没有实现正确赋值,因为你没有显示的调用基类的的这Copy构造函数,没有显示调用,编译器就会默认使用无参构造函数进行初始化。

调用到copy assignment函数时是对基类的所有东西不做任何操作。

怎么办?

SubBase::SubBase(SubBase &subbase)//

: Base(subbase);

,subage(subbase . subage)

{

}

SubBase& SubBase::operator=(const SubBase& subbase)

{

subage = subbase . subbase; 

Base::operator=(subbase);//基类有private类型的量,无法直接调用。

return *this;

}

 

原创粉丝点击