友元函数是用friend关键字声明的非成员函数,可访问类的私有和保护成员。1. 它不属于类,不能通过对象调用;2. 必须在类内声明,可定义在类外;3. 常用于运算符重载等场景。
在C++中,类的私有成员变量(private members)默认只能由该类的成员函数访问,外部函数或其它类无法直接访问。但有时候我们需要让某个非成员函数或另一个类能够访问这些私有数据,这时就可以使用 友元函数(friend function)。
友元函数是一种特殊的函数,它虽然不是类的成员函数,但被授予访问该类所有私有和保护成员的权限。通过在类定义中使用 friend 关键字声明一个函数为友元,这个函数就能像成员函数一样访问类的私有变量。
示例:通过友元函数访问私有成员变量
下面是一个简单的例子,展示如何使用友元函数访问类的私有成员:
#includeusing namespace std; class MyClass { private: int secretValue; public: MyClass(int val) : secretValue(val) {} // 声明一个友元函数 friend void displaySecret(const MyClass& obj); }; // 友元函数定义 —— 不是成员函数,但可以访问 private 成员 void displaySecret(const MyClass& obj) { cout << "Accessing private member: " << obj.secretValue << endl; } int main() { MyClass obj(42); displaySecret(obj); // 输出: Accessing private member: 42 return 0; }
在这个例子中,displaySecret 不是 MyClass 的成员函数,但由于被声明为 friend,它可以访问 secretValue 这个私有变量。

常见于以下场景:
示例:重载
class Person {
private:
string name;
int age;
public:
Person(string n, int a) : name(n), age(a) {}
// 声明 operator<< 为友元
friend ostream& operator<<(ostream& os, const Person& p);
};
// 定义友元操作符函数
ostream& operator<<(ostream& os, const Person& p) {
os << "Name: " << p.name << ", Age: " << p.age;
return os;
}
// 使用时可以直接输出
// cout << personObj;尽管友元提供了便利,但也破坏了封装性,应谨慎使用:
基本上就这些。友元函数是C++中一种灵活但需小心使用的机制,合理使用可以让接口更自然,同时保持必要的数据访问控制。