运用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;
}