谈到析构函数时,几乎所有的我身边的参考书无一例外地只用了一点点篇幅,但Big C++名副其实地难得啰里巴嗦地命中了要害一次
质量提示18.4:如果有析构函数,那么也应有拷贝构造函数及赋值运算符(三个基本函数)
对于管理堆内存的类,必须实现这三个函数
举例:
//String 类非标准string类,为个人创造的类,其中没有定义拷贝构造函数
String a = "GG"; //分配堆
局部作用域{
String b =a; //错误,按成员复制会产生共享堆
}//局部作用域结束,调用析构函数b.~String(),堆空间被删除
//此时a的堆空间已被b的析构函数删除
String a = "GG"; //分配堆
局部作用域{
String b =a; //错误,按成员复制会产生共享堆
}//局部作用域结束,调用析构函数b.~String(),堆空间被删除
//此时a的堆空间已被b的析构函数删除
一般常见的构造模式:
//拷贝构造函数
X::X (const X& right){
copy(right);
}
//赋值运算符重载
X& X::operator=(const X& right){
if (this !=&right){
free();
copy(right);
}
return *this;
}
//析构函数
X::~X(){
free()
}
X::X (const X& right){
copy(right);
}
//赋值运算符重载
X& X::operator=(const X& right){
if (this !=&right){
free();
copy(right);
}
return *this;
}
//析构函数
X::~X(){
free()
}