在运算符重载中传递参数号时出错?

时间:2017-10-20 12:26:33

标签: c++

我想添加两个对象。当我在运算符重载中传递两个参数时,它给出了错误,即必须有零个或一个参数。我想知道为什么我不能将两个对象作为参数传递以添加它们。

class Rectangle
{
private:
    int L;
    int B;

public:

    Rectangle()    //default constructor
    {
        L = 2;
        B = 2;
    }

    Rectangle(int l,int b)      //parametrized constructor
    {
        L = l;
        B = b;
    }

    Rectangle operator+ (Rectangle obj1,Rectangle obj2) //operator overloading   
    {
        Rectangle obj3

        obj3.L = obj1.L + obj2.L;
        obj3.B = obj1.B + obj2.B;
        return obj3
    }  

    void Display()
    {
        cout<< "length is " << L <<endl;
        cout<< "breadth is " << B <<endl;
    }


};

int main()
{
    Rectangle R1;
    R1.Display();

    Rectangle R2(5,3);
    R2.Display();

    //Rectangle R3;
    //R3 = R1 + R2;
    //R3.Display();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

像加法这样的二元运算符需要2个操作数。重载这样的运算符意味着重载方法也适用于2个操作数。你需要只提供1个参数的原因是你声明了你的重载范围,即在Rectangle类中。基本上,由于该重载函数是Rectangle类的成员,因此左侧操作符将被视为 this ,即对象本身的实例。因此,您只需要提供右侧操作符作为参数。

声明您所考虑的功能的另一种方法是将加法运算符重载到Rectangle类的范围之外。然后,你确实必须提供两个操作数。但在这种情况下你应该介意封装。 (即找到一种方法来构造生成的Rectangle实例而不访问Rectangle类的公共成员)这种封装考虑是运营商通常作为成员函数实现的原因之一,尽管对于最近开始学习面向对象编程语言的人来说,参数传递似乎是直观的。

然而,这是关于运算符重载的相当基本的信息,我相信你应该阅读更多有关重载的信息,特别是关于如何通过成员函数重载运算符会影响重载过程。

答案 1 :(得分:1)

在上面的代码中,operator+是一个成员函数。在其声明中它有两个命名参数;它还有一个隐含的this指针,因为它是一个成员函数。这有三个论点。编译器说operator+应该只采用一个或两个参数。这是因为+有两种可能的形式,一种是一元的,一种是二元的。也就是说,您可以编写使用一元加号的+2,也可以编写使用二进制加号的2+2

这可以通过两种不同的方式解决。一个是使它成为static成员函数;它没有this指针,所以带有两个命名参数的静态operator+实际上有两个参数。

更好的方法是使其成为非成员函数。将其移出类定义,并修复分配给obj3的数据成员时产生的错误。 Rectangle有一个带有两个参数的构造函数;用它。您还必须添加一种获取两个值的方法,无论您如何实现此特定功能,都需要这些方法。所以它看起来像这样:

Rectangle operator+(Rectangle obj1, Rectangle obj2) {
    Rectangle obj3(obj1.getL() + obj2.getL(), obj1.getR() + obj2.getR());
    return obj3;
    }

更通用的方法是提供operator+=(Rectangle obj)作为成员函数:

void operator+=(Rectangle obj) {
    L += obj.L;
    R += obj.R;
}

并使用它来实现非成员operator+

Rectangle operator+(Rectangle obj1, Rectangle obj2) {
    obj1 += obj2;
    return obj1;
}