将成员函数的*this赋值给临时对象,两者地址是否相同的问题

关于后置单目运算符重载考虑到的*this赋值问题

  1. 问题描述
    在函数
    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。

  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
    以此证明上述解释正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值