在班级以外重载操作员
所以,我有一个简单的课程:
class complex{
private:
double a,b;
public:
void setA(double a){ this->a=a; }
void setB(double b){ this->b=b; }
double getA(){ return a; }
double getB(){ return b; }
friend complex operator+(const complex&, const complex&);
};
我在这里有实际的重载操作符:
complex operator+(const complex& x, const complex& y){
complex c;
c.a=x.a+y.a;
c.b=x.b+y.b;
return c;
}
我必须让操作符在函数之外重载。 为了访问私有变量(那些也必须是私有的)我用这个函数结识了这个类。 我不知道这是做这种事的正确方法,但至少它是有效的。 我希望能够为两个成员添加一个整数。 在main()中:
complex a;
a.setA(2);
a.setB(3);
a+5;
会导致aa = 7和ab = 8。 班内这样的超负荷很容易造成(再次,不知道这是否是好的解决方案,如果不是的话,请纠正我):
complex operator+(int x){
this->a+=x;
this->b+=x;
}
但我不知道如何让它在课堂之外,因为我不能使用“this”指针。
解决这类问题的常用方法是使用成员函数来定义算术运算符的自反版本和定义非自反版本的自由函数,这些自反函数使用自反版本来实现。 没有朋友声明需要。 例如:
class complex {
public:
complex& operator+=(const complex& rhs) {
x += rhs.x;
y += rhs.y;
return *this;
}
private:
double x, y;
};
complex operator+(const complex& lhs, const complex& rhs) {
complex result = lhs;
result += rhs;
return result;
}
有a+5
的值更改a
是不寻常的,但如果这真的是你想要世界卫生大会,使operator+(int)
成员。 但是,用户通常会想到a+5
会留下a
不变,且a += 5
将修改a
。