c++ 重载赋值函数问题

来源:百度知道 编辑:UC知道 时间:2024/06/27 07:22:42
在重载赋值函数通常会这样写:
String &String::operate=(const String &other)
{//(1)检查自赋值
if(this==&other)
return *this;
// 释放原有的内存资源
delete []m_data;
//3 分配新的内存资源,并赋值内容
int length=strlen(other.m_data);
//4 m_data=new char[lenght+1];
strcpy(m.data,other.m_data);
return *this;
}
想请教一下,如果不写第一步(自赋值),直接写下面的,当我在MAIN函数中出现自赋值情况,输出是乱码。
我调试了一下,
char str="abc";
strcpy(str,str);
cout<<str<<endl;
是能通过编译的而且也正常,所以我个人觉得没有检查自赋值代码,也可完成自赋值,但实际上把(1)检查自赋值的代码去掉,却是错的,输出乱码。
为什么? 解答越详细越好。
书上是这样解释的:第二步delete,自杀后不能赋值,我不太清楚。
顺便问一下代码4,左边的m_data等价于other.m_data 吧,

昏迷啊,如果是自赋值,那么this 和other指向的是同一个东西,这点你能理解吧。
那么我们看看这种情况下这个函数干了什么
首先 delet[] m_data;
这里,似乎只是把this的m_data释放了,
但是刚才也说了,this和other是指向同一个地方的,所以other里面的m_data也被释放了。
然后int length=strlen(other.m_data);
这里发生了什么?如上所说,other的m_data已经被释放了,相信你没忘记吧,既然已经释放了,那么返回多少?
这个问题已经超出了我能知道的范围了,delete以后,原先的m_data指向的位置已经被清空了,但是m_data本身的值没变啊,所以它还是指向原先的那个地址。但是清空了又不是说全是'\0'啊,而length返回的是从该位置开始向后直到'\0'的字节长度,那结果是什么只有神知道了
所以后面所有的操作的结果你都只能去问神了。

说到这里,我觉得你的问题应该已经都解决了。