友元包括友元函数和友元类
友元函数
代码示例:
class Point {
// 友元,只要放在类大括号里面就行,位置随便放
friend Point add(const Point &, const Point &);
private:
int m_x;
int m_y;
public:
// int getX() const { return this->m_x; };
// int getY() const { return this->m_y; };
// 构造函数初始化列表
Point(int x, int y) :m_x(x), m_y(y) { }
};
// 全局函数 const不允许修改
Point add(const Point &point1, const Point &point2) {
return Point(point1.m_x + point2.m_x, point1.m_y + point2.m_y);
}
如果将函数A(非成员函数)声明为类C的友元函数,那么函数A就能直接访问类C对象的所有成员 实现两个点的相加
Point point1(10, 20);
Point point2(20, 30);
Point point = add(point1, point2);
友元类
class Point {
friend class Math;
private:
int m_x;
int m_y;
public:
Point(int x, int y) :m_x(x), m_y(y) { }
};
class Math {
public:
Point add(const Point &point1, const Point &point2) {
return Point(point1.m_x + point2.m_x, point1.m_y + point2.m_y);
}
};
如果将类A声明为类C的友元类,那么类A的所有成员函数都能直接访问类C对象的所有成员
友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能