余睿的博客

浮生若梦,别多会少,不如莫遇

0%

c++运算符重载为友元函数

一般情况下,将运算符重载为成员函数是比较好的选择。

但有时候,重载为成员函数又不能满足需求,重载为普通函数,又不能访问类的私有成员,这时我们就需要将运算符重载为友元。

下面来看一个例子。

1
2
3
4
5
6
7
8
9
10
11
12
class Complex {//复数类
private:
double real, imag;//实部、虚部
public:
Complex(double r = 0.0, double i = 0.0) {
real = r; imag = i;
}
Complex operator+(double r) {//重载为成员函数
//重载+运算符实现 c1+5
return Complex(real + 5, imag);
}
};

我们为上面的Complex重载了+运算符,使得能够实现对象加上一个数。

1
2
3
4
5
6
int main() {
Complex c1(1, 2);
Complex c2;
c2 = c1 + 5;
return 0;
}

这里的c2 = c1 + 5;在重载了+运算符之后就能正常解释了。

有时候我们希望不仅能实现c1+5,还能实现5+c1这种表达,这时简单地重载为成员函数就不能满足需求了,我们需要将+号重载为普通函数。如下所示:

1
2
3
4
Complex operator+(double r, const Complex& c2) {
//解释5+c这种情况
return Complex(r + c2.real, c2.imag);
}

通过上面地重载,看似可以解决问题,但是由于realimag时私有成员变量,此时我们无法通过c2直接访问到私有成员变量。

这是就需要我们将这个普通函数声明为类的友元函数。

1
2
3
4
5
6
7
8
9
10
11
12
class Complex {//复数类
public:
double real, imag;//实部、虚部
Complex(double r = 0.0, double i = 0.0) {
real = r; imag = i;
}
Complex operator+(double r) {//重载为成员函数
//重载+运算符实现 c1+5
return Complex(real + 5, imag);
}
friend Complex operator+(double r, const Complex& c2);//声明为友元函数
};

此时我们就能实现5+c这种运算了。

欢迎关注我的其它发布渠道