友元函数是C++中可访问类私有和保护成员的非成员函数,需用friend在类内声明、定义时不加friend,无this指针、不可继承、不可用const或static修饰。

友元函数是C++中一种可以访问类私有(private)和保护(protected)成员的非成员函数,它不隶属于该类,也不受访问控制限制,但必须由类显式声明为“朋友”——用friend关键字在类内部声明。
友元函数的核心特点
它不是类的成员,没有this指针;不能被继承;不能用const或static修饰;声明时加friend,定义时**不加**friend;可定义在类内(隐式内联)或类外(需提前声明)。
如何声明和定义友元函数
- 在类内部用
friend声明函数原型(含返回类型、名字、参数列表) - 该函数可在类外单独定义,像普通函数一样实现
- 若函数在类内定义,则自动成为内联函数,且仍需写
friend
示例:
class Box {
private:
double width = 10.5;
public:
friend void printWidth(const Box& b); // 声明友元
};
void printWidth(const Box& b) { // 定义:不写 friend
std::cout << "Width: " << b.width; // 可直接访问 private 成员
}
常见使用场景
-
重载输入输出运算符:如
operator常需访问私有数据,又不能是成员(左操作数是std::ostream) -
两个类之间的深度协作:比如
Matrix类允许Vector类的某个函数直接读取其内部数组 -
简化调试或日志函数:快速打印私有状态,避免为每个字段写
get接口
注意事项与潜在风险
- 破坏封装性——友元绕过了访问控制,应仅在必要时使用
- 友元关系不可传递、不可继承、不具有对称性(A是B的友元,不意味B是A的友元)
- 头文件中声明友元函数时,若其实现依赖其他类,注意包含顺序和前置声明











