【问题标题】:Error while passing argument number in operator overloading?在运算符重载中传递参数号时出错?
【发布时间】:2017-10-20 12:26:33
【问题描述】:

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

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;
}

【问题讨论】:

  • 如果是成员函数,则对象本身会有一个自动额外的参数(*this)。
  • 在构造函数中使用初始化列表
  • 并阅读有关 const 引用的信息。对操作员更好,并节省复制
  • 通过this,您将获得有关运算符重载的所有基本知识

标签: c++


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在上面的代码中,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;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 2021-02-02
      • 2016-03-17
      • 1970-01-01
      相关资源
      最近更新 更多