我想添加两个对象。当我在运算符重载中传递两个参数时,它给出了错误,即必须有零个或一个参数。我想知道为什么我不能将两个对象作为参数传递以添加它们。
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;
}
答案 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;
}