为什么我不能在operator =中使用引用类型?

问题描述 投票:2回答:2

我试图为我的课程覆盖operator+operator=。这是我的代码:

#include <iostream>
#include <vector>

using namespace std;

class Integer {
public:
    int i;
    Integer operator+ (Integer&);
    Integer& operator= (Integer&);
};

Integer Integer::operator+(Integer& rhs) {
    Integer res;
    res.i = this->i + rhs.i;

    return res;
}

Integer& Integer::operator=(Integer& rhs) {

    this->i = rhs.i;
    return *this;
}

int main()
{
    Integer i1, i2, i3;
    i1.i = 1, i2.i = 2;
    i3 = i1 + i2;
    cout << i3.i;
}

在Visual Studio 2017中,编译器抱怨说:

"E0349  no operator "=" matches these operands"

似乎Integer对象与Integer&函数中的operator=不匹配。但它适用于operator+功能。这非常令人困惑。

非常感谢。

c++ operator-overloading
2个回答
3
投票
i3 = i1 + i2;

返回Integer类型的临时变量。

现在,你的operator=需要一个Integer&。这是对Integer的引用。问题是临时工具不能绑定到非const引用。

只要确保你改为const Integer&。这是所有运算符重载的默认值。


2
投票

我将从赋值声明中删除它。

i3 = i1 + i2;

首先发生的是添加表达式得到评估。这是这段代码:

i1 + i2

您设计了运算符重载来处理此表达式。您的自定义加法运算符重载返回一个新的Integer实例。但是当您尝试将此新实例分配给赋值重载中的参数时,会出现此问题。这是该代码的片段。

Integer& Integer::operator=(Integer& rhs);

在函数声明中使用引用参数时,编译器会检查以确保此值不是临时值,以便在调用函数后它将存在。编译器已(确切地)确定传递给此赋值语句的参数是临时值。这就是为什么当你尝试这样做时它会吐出错误的原因。

我认为使代码有意义的最合理的原因是实现以下内容:

Integer& Integer::operator=(const Integer& rhs) {
    this->i = rhs.i;
    return *this;
}

通过添加const-specifier,您可以告诉编译器在调用函数后,您不依赖于rhs来保持存在。在这种情况下,传递给参数的值可以是临时值。

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