移动赋值为什么返回引用

下面这段代码是自实现的myString的移动赋值(深拷贝)

class myString
{
public:
    myString()
    {
        _str = new char;
        *_str = '0';
    }
    myString(char * str)
    {
        int len = strlen(str);
        _str = new char[len+1];
        strcpy(_str,str);
    }
    ~myString()
    {}
    myString & operator = (const myString & another)
    {
        printf("another address = %0X\n",&another);
        printf("this address = %0X\n",this);
        this->_str = new char[strlen(another._str)+1];
        strcpy(this->_str,another._str);
        return *this;
    }
    
    char * _str;
    
};


int main()
{
    int num =1;
    myString a ("num");
    myString b;
    myString c;
    (c=b)=a;
    cout<<c._str<<endl;
    cout<<b._str<<endl;
    return 0;
}

如果移动赋值返回引用,则打印结果如下
在这里插入图片描述
如果移动赋值不返回引用,返回的是对象,则打印结果如下
在这里插入图片描述
分析上述结果可以得出
返回引用(c=b)=a的时候,c=b的表达式返回值是c的引用,(c的地址都是61FE90)。
使用a对c的引用再次赋值,所以cout<<c._str<<endl可以打印出“num”

返回对象(c=b)=a的时候,c=b的表达式返回值是c的一个拷贝出来的新对象,
(c的地址是61FE88,拷贝产生的新对象是61FE98)。
使用a对新对象进行赋值,所以cout<<c._str<<endl只能打印出“0”

提醒:类中申请了空间的对象若要进行拷贝,一定要自实现深拷贝!
系统默认实现的是浅拷贝,只是拷贝一个地址而已。空间被回收后再次访问就会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值