1、定义:友元位置是在一个类public中的函数,定义的时候不能用类型 类名::函数名
,因为不是成员函数,只是朋友的关系,但是友元却可以直接调用私有成员。(友元一般声明为公有)
2、形式:
class X
{
friend 类型T 函数名称f(参数);
};
T f(参数)
{
}
3、通常友元的参数是类类型的,因为这样才能更好地体现友元的意义。
4、友元一般类内声明,类外定义,并且在类内声明的时候要加上friend但是在类外定义的时候不能带着friend。
例如:
#include <iostream>
#include <cmath>
using namespace std;
class Point
{
private:
int _x,_y;
public:
Point():_x(0),_y(0){}
Point (int x):_x(x),_y(x){}
Point (int x,int y):_x(x),_y(y){}
Point(const Point &p):_x(p._x),_y(p._y){}
int getx(){return _x;}
int gety(){return _y;}
friend int dist2(Point p,Point q);
};
int dist1(Point p,Point q)
{
int x=p.getx()-q.getx();
int y=p.gety()-q.gety();
return sqrt(x*x+y*y);
}
int dist2(Point p,Point q)//Point ::没有,因为是朋友而不是成员;dist2是Point的朋友,所以可以调用其私有成员;
{
int x=p._x-q._x;
int y=p._y-q._y;
return sqrt(x*x+y*y);
}
int main()
{
Point p1(0,0),p2(5,0);
cout<<dist1(p1,p2)<<endl;
cout<<dist2(p1,p2)<<endl;
}
上例中体现了友元函数的优点
注意:
(1)友元是一种特殊的普通函数,用friend声明友元
(2)友元函数并非类的成员函数
(3)友元不具有逆向性和传递性,例如:若A是B的友元并不表示B是A的友元;若A是B的友元,B是C的友元,也不代表A是C的友元。
拓展:sqrt头文件为#include <cmath>
补充
一、友元分为友元函数和友元类两种
1、友元函数
一个类的友元函数可以访问该类的私有成员
2、友元类
如果类A是类B的友元类,那么A的成员函数可以访问B的私有成员。
例如:
#include <iostream>
using namespace std;
class Point
{
private:
double _a,_b;
public:
friend class Line;
};
class Line
{
private:
Point p1;
double sum;
public:
void zonghe()
{
sum=p1._a+p1._b;
}
};
Line是Point的友元类,那么Line可以调用Point中的私有成员;