默认的复制构造函数会逐个复制非静态成员及成员的值(如直接将一个对象通过赋值运算符赋值给另外一个对象时),这种成员复制也称为“浅复制”。浅复制最容易带来的问题是,两个类中的指针都指向同一个内存地址;这样当其中一个对象调用析构函数销毁自己时,内存被释放,这样就会让另一个对象的指针无的放矢,此外在调用析构函数时,会进行第二次内存释放,这是一种错误。
解决上述问题的办法是,提供一个重载的赋值运算符,它的实现与复制构造函数类似,在其中,不只是简单的复制指针地址,而是将指针所指向的内存中的内容也复制过来,这就是 深度复制。如下面代码所示:
[C++] 纯文本查看 复制代码 StringClass & StringClass::operator = (const StringClass &st)
{
if (this == &st)
return *this; //如果是赋值给自己就直接返回
delete [] str; //释放原来的内存区
len = st.len;
str = new char [len + 1]; //新指向内存区的长度
std::strcpy(str, st.str); //拷贝字符串,这个就是“深复制” 了
return *this; // 返回调用对象的引用
}
|