关于C++中的自我赋值的问题
我看到很多成员函数,尤其是重载运算符的成员函数,都要判断是否自我赋值,C++编程思想上解释好象是防止产生什么?大家给我个解释. 问题点数:30、回复次数:6Top
1 楼GRIEG(丁丁)回复于 2001-06-14 08:51:00 得分 10
String::String::operate =(const String &other)
{
if (this == &other) return *this;
delete []m_date;//需要判断的原因,将自己的原来数据删除
int length = strlen(other.m_data);
m_data = new char[length+1);
strcpy(m_data, other.m_data);
return *this;
}
所以当出现
b=a;
c=b;
a=c;(自复制时不会删除自身)
Top
2 楼myan()回复于 2001-06-14 09:17:00 得分 5
也不光是出于安全考虑,效率上也大大提高。Top
3 楼holyfire(谁最衰啊你最衰,谁最帅啊我最帅)回复于 2001-06-14 09:22:00 得分 5
消除了一些隐患吧,就算你再注意,给自己赋值会出现什么情况也很难说,特别是在一个特殊的复杂的表达式中出现的话。Top
4 楼cber(cber)回复于 2001-06-14 11:59:00 得分 10
Herb Sutter在XC中批判了GRIEG(丁丁)的那种写法,因为那样做会导致exception-unsafe,如果想要exception-safe的话,可以试一试使用swap的技巧,大概如下:
A& A::operator=(const A& other)
{
A tmp(other);
swap(*this,tmp);
return *this;
}
这样就可以了,甚至不用去判断是否自我赋值.不过对于对象很大的情况下,判断一下会比较高效一点;-)Top
5 楼blue_water(蓝色瀑布)回复于 2001-06-15 20:19:00 得分 0
我想了一下,终于明白了,谢谢各位了。每个人加30分!!!
谢谢CHER的写法。!!!Top
6 楼blue_water(蓝色瀑布)回复于 2001-06-15 20:20:00 得分 0
不好意思,我以为可以给每个人30分呢,只好将就了。Top




