菜鸟我在看《C++大学教程》的疑问:对象的自我赋值会有什么危害呢?能举例说明一下吗?

mxic 2002-09-30 04:14:21
问题同上。
...全文
49 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kxw 2002-10-11
  • 打赏
  • 举报
回复
class T
{
public:
.......
private:
int member;
};

const T& operation= (const T& rhs)
{
if(*this == rhs )
return *this;

member = rhs.member

}

看一下,effective c++ item 16
===================================================================

我的心太乱
fangrk 2002-10-08
  • 打赏
  • 举报
回复
所以自己写复制构造函数是要加上一段
obj&
obj:: operator=(const obj&rhs)
{
if(&rhs!=this) return *this;
......
}
fangrk 2002-10-08
  • 打赏
  • 举报
回复
自我赋值没问题的,一般说来operator =都会检查是否是自我赋值,如果是的话直接返回的。
fangrk 2002-10-08
  • 打赏
  • 举报
回复
自我赋值没问题的,一般说来operator =都会检查是否是自我赋值,如果是的话直接返回的。
北极猩猩 2002-10-08
  • 打赏
  • 举报
回复
所以自己写复制构造函数是要加上一段
if(des!=*this){
//...
}
ycqdq 2002-10-08
  • 打赏
  • 举报
回复
是不是就会出一个空的值啊?我也在学习啊.
anyoshon 2002-10-08
  • 打赏
  • 举报
回复
一般是没有问题的.
不过,自己写的话,必须知道这一点.
mxic 2002-10-01
  • 打赏
  • 举报
回复
也就是说对含有指针成员变量的类来说,需要在程序里要重载赋值运算符,对吗?
waterstony 2002-10-01
  • 打赏
  • 举报
回复
而且记得要检查是否是自我赋值。
leasun 2002-09-30
  • 打赏
  • 举报
回复
自我赋值前会先delete lhs
waterstony 2002-09-30
  • 打赏
  • 举报
回复
判断自我赋值对含有指针成员变量的类来说尤其重要。
举一例子
class String{
...
private:
char* pt;//指向字符串的指针
...
}

String sa,sb;
sa = 'abcd';
sb = 'efghijkl';
sa = sb;

赋值的简要流程是这样的:先做this判断,再把sa的内容清空(delete pt),然后new出一块跟sb一样大小的区域,并把sb的东西拷进这块空间,最后sa的内容就是'efghijkl'了。

如果不作this判断,那么当sa = sa时,先作了delete pt,sa的内容都没有了,后面的步骤都做不下去了。

要想知道得更多,看effective c++。
mxic 2002-09-30
  • 打赏
  • 举报
回复
ashchan((www.ashchan.com)) :
您所说的“删除”操作是在编译/运行时自动发生的吗?还有当:
在类的定义时给出/不给出重载的赋值运算符以及复制构造函数时,会有什么不同?

这些问题我不是很清楚,书上也交代的不明确。
ashchan 2002-09-30
  • 打赏
  • 举报
回复
一般的赋值操作,会先把将被赋值的对象(lhs)删除掉,然后将要赋值给它的对象(rhs)的内容通过特定方法赋给lhs;如果是自我赋值,则lhs与rhs是同一个,当删除lhs时,也同时删除了rhs(本来它们就是同一个对象),这样当再将rhs的内容赋给lhs时,就出问题罗(不用我说你也知道了吧)。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧