标签:
资料摘自<C++沉思录>
自我赋值常常被错误地应用,考虑下面的一段代码:
class String{
public:
String & operator=(const String &s);
private:
char * data;
};
我们会轻易地使用下面的方法来实现赋值:
String &String::operator=(const String & s)
{
delete [] data;
data = new char[strlen(s.data)+1];
strcpy(data, s.data);
return * this;
}
乍一看,这个方法好像是没有问题的,但是当我们把一个String对象赋给它本身时,这个方法就会彻底失败,因为s和*this都指向同样的对象.
避免这个问题的最简单的方法就是显式地加以预防:
//方案1
String &String::operator=(const String & s)
{
if(&s != this){
delete [] data;
data = new char[strlen(s.data)+1];
strcpy(data, s.data);
}
return *this;
}
//方案2
String &String::operator=(const String & s)
{
char * newdata = newchar[strlen(s.data)+1];
strcpy(newdata, s.data);
delete [] data;
data = newdata;
return * this;
}
标签:
原文地址:http://blog.csdn.net/afei198409/article/details/45842695