【问题标题】:Operator overloading returning a reference运算符重载返回引用
【发布时间】:2020-07-09 19:36:10
【问题描述】:

在研究运算符重载的同时,我试图了解返回引用的真正意义。我创建了这个非常简单的问题:

#include <iostream>
using namespace std;

class mydoub {
    public:
        double pub;
        mydoub(double i = 0) : pub(i) {}
};

mydoub &operator += (mydoub &a, double b) {
    a.pub = a.pub+b;
    return a;
}


int main() {
    mydoub a(5), b(6);
    cout << "1: " << a.pub << "  " << b.pub << endl; // expected output 1: 5 6
    b = a+= 7;
    cout << "2: " << a.pub << "  " << b.pub << endl; // expected output 2: 12 12
    b.pub = 8;
    cout << "3: " << a.pub << "  " << b.pub << endl; // unexpected output: 3: 12  8
}

输出是:

1: 5  6
2: 12  12
3: 12  8

这对我来说是非常出乎意料的。事实上,b 已经被分配了对 a 的引用,就在后者被修改之后,所以我希望 b.pub=8 也会对 a 起作用,因为引用通过运算符 @ 987654327@。为什么不是这样?那么与非引用重载有什么区别,比如mydoub operator += ( ..

【问题讨论】:

    标签: c++ reference operator-overloading pass-by-reference


    【解决方案1】:

    你搞砸了对参考的理解。实际上,引用只是取消引用的指针,当您执行b = a 时,它实际上是将a 值复制到b,它们并没有指向同一个对象。要指向同一个对象,您需要使用指针或使 b 不是 mydoub 类型,而是 mydoub& 类型(在这种情况下,初始化时您可以指向同一个对象)。

    mydoub& 运算符 += 用于修改 += 运算符的结果。例如,

    mydoub a = 1;
    ++(a += 3)
    

    之后是 5,但如果你使用 mydoub 运算符 += 它将是 4。

    【讨论】:

    • 那么,你是说通过引用传递相当于提供某种临时指针指向我要返回的内容,但只是在 return 语句的范围内?
    • 它只是返回临时指针的等价物,但被取消引用。因此,引用不能为空。
    • 好的,非常感谢,我想我现在明白你的意思了,这对我来说很有意义
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多