关于后置单目运算符重载考虑到的*this赋值问题
-
问题描述
在函数
class A {…
};
A A::operator++(int)
{
A a=* this;
this->value++;
return a;
}
int main()
{
A a(1);
a++;
a.show();
return 0;
}
我们可以看到,此时value++作用的是调用重载运算符的对象的数据成员,而函数返回的则是我们创建的临时对象。按理说,第一步中,a只是接收了(*this)的值,生成了一个副本。但我们对this指向的value值进行改变,也影响了临时对象a中的value值。此时a.show()的结果当然是2。 -
个人猜测
此时只能想到的是,系统进行的A a=* this是一种潜在的引用传递(不是很理解为什么不用A &a),此时的a与(*this)的地址相同。即为(*this)赋值时,可能默认为“引用赋值”。个人猜测,欢迎指正。
——————————————————————————
二更:
-
第二天看了一下,好像换个思路,问题就解决了
-
解释: 由于这是后置单目运算符,所以它的自加++是在当前语句不体现出来的(实际上它的值已经改变了),例如将上述语句改为a++.show(),输出就为1。然后下一行再写a.show(),输出就变为了2。这里可以看出,第一个起作用的是临时对象a,第二个起作用的是this指向的当前对象a。也就是a++返回的值不是原来的拥有新值的a,而是一个“隐含的拥有旧值的临时对象a”。
—————————————————————————
补充: -
将上述代码改为
A A::operator++(int)
{ A &a=* this; this->value++; return a; }
此时a++.show()和a.show() 均为2
以此证明上述解释正确。