正确地将对象赋值给对象本身了吗?

资料摘自<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;

}

,你并不一定会从此拥有更美好的人生,

正确地将对象赋值给对象本身了吗?

相关文章:

你感兴趣的文章:

标签云: