1、普通函数
String s1,s2;
s1="this";
s2="that";
s1=s2;
(1)这里如果delete s1的话,那么s1所指向的存储空间会被消除,但是s2和s1所指向同样的存储空间,所以会导致指针悬挂。
(2)其次在s1结束后,会再一次执行析构,因为一个地方只能析构一次,所以这样会导致程序崩溃。
2、运算符重载
MyString s;
s="hellow";
s=s;//这个错误很有可能在用到引用的时候,比如&r=s;s=r;这个时候会出现这个错误;
String& operator =(const String& s)
{
if(this==&s)//如果是同一个对象的话,就返回本身,如果不同的话执行下面的语句;
return *this;
delete []str;//当出现s=s的时候,如果delete []str的话,会导致s.str里面没有内容了,这样下面是错误的;所以可以加上上面两个语句来避免这个错误;
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
return *this;
}
3、对operator=返回值类型的讨论
对运算符进行重载的时候,好的风格是应该尽量保留运算符原本的特性,也就是返回值最好是类;
a=b=c;
意思是b返回值的类型赋给a;
(a=b)=c;
意思是a和c的返回值类型一样,与b没有关系,而且a返回的是引用,因为要作为左值;