操作符重载返回引用

问题描述 投票:0回答:1

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

#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。 C0]。为什么不呢?那么,非引用重载(例如+=)有什么区别?

c++ reference operator-overloading pass-by-reference
1个回答
0
投票

您正在弄乱对参考的理解。实际上,引用只是被取消引用的指针,并且当您执行mydoub operator += ( ..时,它实际上是将a值复制到b,它们没有指向同一对象。要指向同一对象,您需要使用指针或将b设置为mydoub&类型而不是mydoub&type(在这种情况下,初始化时您可以指向同一对象)。

© www.soinside.com 2019 - 2024. All rights reserved.