友元函数是类显式授权、可访问其私有和保护成员的非成员函数;需在类内用friend声明原型,定义在类外,常用于重载运算符、跨类协作等场景。

友元函数是C++中一种被类显式授权、可以访问该类私有(private)和保护(protected)成员的普通函数——它不是类的成员,也不受访问控制限制,但必须由类主动声明为friend。
友元函数怎么声明和使用?
在类内部用friend关键字声明函数原型,不加public/private,也不带static或virtual等修饰。该函数可以是全局函数,也可以是其他类的成员函数。
- 声明位置任意(通常放在类开头或结尾),不影响访问权限
- 友元关系不继承、不传递:A把函数f设为友元,B继承A,f对B仍无特权
- 函数定义写在类外,像普通函数一样实现,无需加作用域解析符(如
A::)
为什么需要友元函数?
当某些操作逻辑上不属于类的职责,却需要深度访问其内部数据时,友元提供了一种可控的“破例”机制。典型场景包括:
- 重载输入输出运算符(如
operator),因为流对象在左,类对象在右,无法作为成员函数(否则cout 会要求cout提供成员函数) - 两个不同类之间需高效协作(如矩阵类与向量类的乘法),避免暴露接口或拷贝开销
- 调试辅助函数、序列化函数等工具性代码,只在特定上下文需要访问私有状态
友元函数要注意什么?
它打破了封装性,所以要用得克制。常见注意事项:
立即学习“C++免费学习笔记(深入)”;
- 友元不是成员函数:没有
this指针,访问成员必须通过对象名(如obj.private_data) - 不能直接访问类的静态私有成员?错——它可以,只要按正常方式写(如
A::static_private或obj.static_private) - 类声明中声明友元,不代表该函数已定义;链接时若未定义,会报
undefined reference - 头文件中声明友元,要确保定义可见(常把定义放在对应.cpp里,或内联在头文件中)
基本上就这些。友元不是封装的敌人,而是封装的协作者——关键在“谁授权”和“为何授权”,而不是“能不能访问”。










