非常量引用的初始值必须为左值的问题

前言

前言
看了b站的黑马程序员C++中++运算符重载的章节后,里面的一个细节引起我的深思。。


一、问题

为什么这里不需要引用?在这里插入图片描述
自己敲了代码后发现,如果是加了引用的<<运算符重载,后置++运算符测试中,出现问题。

在这里插入图片描述
当我把鼠标放到test2里最后一个myint对象上时,显示的类型是
在这里插入图片描述

乍看之下两者并无区别,经过一系列检验测试,我得到一个猜想(不知是否正确):因为MyInt 和 MyInt myint对象是不一样的。所以编译器里没有关于MyInt的“<<符”重载。

二、思考

那么是哪里不一样呢?为什么前置++运算符重载里就没有问题呢?经过2个小时的思考和百度,发现“左值和右值”是这里的关键。

左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时就不再存在的临时对象。

也就是说,MyInt是右值,MyInt myint对象是左值。那为什么cout << myint++ << endl;这里的myint++不是一个MyInt类的对象呢?

实际上,重载"<<“和”++"后cout << myint++相当于<<(cout,++())。
重载代码见下方:

    MyInt& operator++()
    {
        this->m_Num++;
        return *this;
    }
    //后置++
    MyInt operator++(int)
    {
        MyInt temp;
        temp.m_Num = this->m_Num;
        this->m_Num++;
        return temp;
        //返回局部对象,只能值传递返回,不能返回引用
    }

后置++重载时,函数内部的局部对象temp,会在拷贝构造一个新的temp’后析构(值传递返回),因此<<()中接收到的是个右值。

而前置++重载时,是通过this指针返回类自身地址,++()后,类自身依旧存在。因此是个左值。

最后,加一个const 也能解决。百度到某一个相关问题的回答中提到“const 引用才能接收右值、临时量”。friend ostream& operator<<(ostream& cout, const MyInt &myint);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值