定义个Point类
class Point
{
private:
double x;
double y;
public:
Point operator*(const Point& b);
Point operator*(double m);
}
定义Point对象a, c;
c = a*3.1;这样是正确的,可调用第二个重载函数
c = 3.1*a;这样是错误的,因为重载操作符*左边的是调用对象,但是3.1不是Point对象。
这个时候我们就引入了友元函数,上面的调用可以写成下面的形式:c = operator*(3.1, a), 该函数的原型如下:Point operator*(double m, const Point& b);
有了友元函数,就可以智能识别使用哪一个重载操作。
创建友元函数的第一步是将该函数的原型声明加入到类中,并在前面加上friend关键字:
friend Point operator8(double m, const Point& b);
该原型意味着下面两点:
1.虽然operator*()函数是在类中声明的但是并不是类的成员函数,因此不能使用成员操作符来调用。
2.虽然operator*()函数不是成员函数,但是与成员函数有相同的访问权限。
第二步是编写函数定义。因为他不是成员函数,所以不要使用Point::(类名加作用域解析操作符)限定符。另外不要再定义中使用friend关键字,定义应该如下:
Point operator*(double m, const Point& b)
{
Point c;
c.x = b.x * m;
c.y = b.y * m;
return c;
}