友元包括友元函数和友元类

友元函数

代码示例:

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对象的所有成员

友元破坏了面向对象的封装性,但在某些频繁访问成员变量的地方可以提高性能