您好我正在尝试为+(加法)运算符执行运算符重载以添加用户定义的数据类型对象。 以下是该代码。
#include <iostream>
using namespace std;
class complex {
int i;
double f;
public:
complex(int ii=0,double ff=0){
i = ii;
f = ff;
}
complex operator+(complex object) {
complex result;
result.i = this->i + object.i;
result.f = this->f + object.f;
return result;
}
void display() {
cout << i <<"\t"<< f;
cout << endl;
}
};
int main(){
complex obj1(1,1.1),obj2(2,2.2),obj3;
int i(5);
obj3 = obj1 + obj2;
obj3.display();
obj3 = obj3 + i;
obj3.display();
obj3 = i + obj3;//generates me compiler error
obj3.display();
return 0;
}
我了解到当我做obj1 + obj2时,它被编译器扩展为obj1.operator +(obj2); 所以这部分代码工作正常。
但是当我添加一个int和complex时,我认为它会扩展为i.operator(obj1)。
所以它给了我编译错误。
我应该在int类中定义operator +函数还是如何解决这个问题? 请建议, 谢谢,
答案 0 :(得分:3)
您必须提供+
的重载版本,该版本将int
和类complex
对象作为输入参数。此函数应该是非成员函数。
complex operator+(int i, complex object)
另请注意,如果您想要访问此重载功能中的protected
或private
成员,则必须将friend
类设为complex
。< / p>
这是用于运算符重载的自由函数强度的一个特殊示例,与成员函数运算符重载相反。
答案 1 :(得分:2)
这就是为什么operator+
通常被定义为自由函数的原因:你可以(应该)定义一个自由函数而不是complex complex::operator+(complex object)
complex operator+(const & complex lhs, const & complex rhs)
{
return complex(lhs.i + rhs.i, lhs.j + rhs.j);
// You will need some way to access i and j, either by making this function
// a friend of complex or by providing getters
}
这样,行obj3 = i + obj3
将等同于operator+(i, obj3)
;由于您编写的构造函数可以将整数转换为复数,因此调用将成功并与此相同:operator+(complex(i), obj3)
。
根据经验,当左侧和右侧大小具有相同的重要性时,您应该更喜欢自由函数而不是成员函数来重载二元运算符。这样,您知道如果a op b
有效,那么b op a
也会有效。
在旁注中,您还应该更喜欢将参数作为reference-to-const传递,并将成员函数标记为const(如示例中的operator+
和display
)。< / p>
答案 2 :(得分:0)
在任何类之外定义一个函数:
complex operator + (int lhs, complex rhs) { /* ... */ }
确保编译器可以看到它,并且您可以为复合物添加内容。你可能也想要一个带参数的方法。