浅拷贝和深拷贝

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返回的是引用,因为要作为左值;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值