前言 看了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);
