运算符就像 的成员函数,class rectangle
但具有另一种调用格式。
您也可以按照int len = r1.operator+(r3);
其他用户的建议作为函数调用。
因此,当您使用类中的运算符编写操作时,编译器会尝试将调用与某些给定的运算符匹配;在您的电话中:
int len = r1+r3;
编译器寻找一个operator+
返回可以放入的东西的int
a 并接收 arectangle
作为参数,它找到了你的int operator+(rectangle r1)
函数;然后使用参数调用此函数r3
并返回int
结果。
给int operator+(rectangle r1)
函数的参数是 so 的副本,r3
这就是为什么是操作 overr3
而不是 over r1
or r2
。
问题中没有提到这一点,但我认为值得一提:
似乎您operator+
不适合运算符通常遵循的模型,如果您要添加 arectangle
并获取与操作不同的对象,rectangle
它看起来不像运算符;我认为你必须考虑你想要得到什么以及rectangle
s的总结是什么。
作为二元运算符,它通常获取并返回相同类型的对象(以便在操作链中使用它)并且必须是 const,因为它不会更改对象本身:
class rectangle
{
// Reference in order to avoid copy and const because we aren't going to modify it.
// Returns a rectangle, so it can be used on operations chain.
rectangle operator+(const rectangle &r) const
{
rectangle Result;
// Do wathever you think that must be the addition of two rectangles and...
return Result;
}
};
int main()
{
rectangle r1(10,20);
rectangle r2(40,60);
rectangle r3 = r1 + r2;
// Operation chain
rectangle r4 = r1 + r2 + r3;
rectangle r5 = r1 + r2 + r3 + r4;
// Is this what you're looking for?
int width = (r1 + r3).width();
int height = (r1 + r3).height();
}
如果是一元运算符,则参数和返回值也必须是同一类型,但返回值必须是参与运算的对象:
class rectangle
{
// Reference in order to avoid copy and const because we aren't going to modify it.
// Returns a rectangle, so it can be used on operations chain.
rectangle &operator+=(const rectangle &r) const
{
// Do wathever you think that must be the addition of two rectangles and...
return *this;
}
};
int main()
{
rectangle r1(10,20);
rectangle r2(40,60);
rectangle r3 = r1 + r2;
// Weird operation chain, but it's only an example.
rectangle r4 = (r1 += r2) += r3;
rectangle r5 = (r1 += r2) += (r3 += r4);
}