友元函数和友元类可访问私有成员,用于运算符重载和类间协作。1. 友元函数用friend声明,非成员函数但能访问私有数据;2. 友元类所有成员函数均可访问目标类私有成员;3. 关系单向、不传递、不继承;4. 应谨慎使用以避免破坏封装性。

在C++中,友元函数和友元类是一种特殊的机制,允许外部函数或另一个类访问当前类的私有(private)和保护(protected)成员。这打破了封装性,但某些场景下非常实用,比如运算符重载、两个类紧密协作等。
友元函数的使用方法
友元函数不是类的成员函数,但它可以访问类的所有成员,包括私有成员。声明时使用 friend 关键字。
基本语法:
class MyClass {private:
int data;
public:
MyClass(int d) : data(d) {}
friend void printData(const MyClass& obj); // 声明友元函数
};
// 定义友元函数
void printData(const MyClass& obj) {
std::cout }
调用方式:
立即学习“C++免费学习笔记(深入)”;
MyClass obj(100);printData(obj); // 输出:Data: 100
常见用途:重载输入输出运算符(如 和 >>)通常定义为友元函数。
友元类的使用方法
一个类可以被声明为另一个类的友元类,这样该类的所有成员函数都可以访问目标类的私有和保护成员。
class Helper; // 提前声明class DataContainer {
private:
int value;
public:
DataContainer(int v) : value(v) {}
friend class Helper; // 声明Helper为友元类
};
class Helper {
public:
void showValue(const DataContainer& dc) {
std::cout }
void setValue(DataContainer& dc, int v) {
dc.value = v;
}
};
使用示例:
DataContainer dc(50);Helper h;
h.showValue(dc); // 输出:Value: 50
h.setValue(dc, 99);
h.showValue(dc); // 输出:Value: 99
注意:友元关系是单向的,不能传递。即A是B的友元,不代表B是A的友元;C是A的友元,也不能通过A访问B的私有成员。
注意事项与最佳实践
虽然友元提供了便利,但应谨慎使用,避免破坏封装性。
- 只在确实需要访问私有成员的场景下使用友元
- 尽量缩小友元范围,优先使用友元函数而非整个友元类
- 友元不改变成员访问权限,它只是授予访问特权
- 友元关系不能被继承
基本上就这些。掌握好友元的使用,可以在保持封装的同时实现必要的跨类协作。










