友元包括友元函数和又元类
友元函数
- 在类外定义的函数,可以在在类内进行声明,但要在前面加上关键字friend,这样就构成了友元函数
- 友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数
- 友元函数可以访当前类中的所有成员(private、public、protected)
- 友元函数会破坏面向对象的封装性,但是在某些频繁访问成员变量的地方可以提高性能
-------------------------------------------将两个点相加-----------------------------------------------------
class Point {
private:
int m_x;
int m_y;
public:
Point(int x, int y) :m_x(x), m_y(y) { }
void display() {
cout << "(" << m_x << ", " << m_y << ")" << endl;
}
friend Point add(Point, Point);
};
Point add(Point p1, Point p2) {
return Point(p1.m_x + p2.m_x, p1.m_y + p2.m_y);
}
int main() {
Point p1(10, 10);
p1.display();
Point p2(20, 20);
p2.display();
Point p3 = add(p1, p2);
p3.display();
getchar();
return 0;
}
运行结果
(10, 10)
(20, 20)
(30, 30)
说明:
1、友元函数的声明可以在类内的的任意位置
2、友元函数不是类的内部函数
3、友元函数的关系是单向的,并不能到过来
4、友元关系不能传递
友元类
跟友元函数一样,也可以将一个类声明为另一个类的友元类,这个友元类就可以访问当前类的所有成员了
-------------------------------------------计算两个点之间的距离-------------------------------------------
class Point {
private:
int m_x,m_y;
public:
Point(int x,int y):m_x(x),m_y(y){}
void show(){
printf("Point(%d,%d)\n",m_x,m_y);
}
friend class Line;
};
class Line {
private:
Point p1,p2;
public:
Line(Point& p1,Point& p2):p1(p1),p2(p2){}
float distance(){
return sqrt((p1.m_x-p2.m_x)*(p1.m_x-p2.m_x)+(p1.m_y-p2.m_y)*(p1.m_y-p2.m_y));
}
};
int main(){
Point p1(1,1);
p1.show();
Point p2(2,2);
p2.show();
Line line(p1,p2);
printf("distance=%f\n",line.distance());
return 0;
}
运行结果
Point(1,1)
Point(2,2)
distance=1.414214