浅复制和深度复制
- 浅复制:仅复制指针值,新的指针和原来的指针指向同一地址,执行析构函数会释放同一内存单元两次,造成悬挂指针。
- 深度复制:通过将副本地址赋给新成员,复制指向的数据。
复制构造函数
如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据,而仅仅是指针。
复制构造函数用于将一个对象复制到新创建的对象中,因此,它用于初始化过程中(包括按值传递参数),而不是常规的赋值过程中。
原型:Class_name(const Class_name &);
class String
{
private:
char *str;
int len;
...
public:
...
String(const String &); // 复制构造函数
};
...
String::String(const String &st) //复制构造函数定义
{
len=st.len;
str=new char [len+1]; //用new分配内存
strcpy(str,st.str);
}
何时使用复制构造函数
- 将新对象初始化为一个同类对象;
- 按值将对象传递给函数;
- 函数按值返回对象;
- 编译器生成临时对象。
复制赋值运算符
String & String::operator=(const String &st)
{
if(this == &st)
return *this;
len=st.len;
delete[] str; //先delete原来的内存
str=new char [len+1]; //再用new重新分配内存
strcpy(str,st.str);
return *this;
}