9.C++友元函数
C++友元函数
友元函数(Friend Function)是C++中一种特殊的函数,它能够访问类的私有(private)和保护(protected)成员,即使它不是该类的成员函数。
基本概念
友元函数的特点:
- 不是类的成员函数,但可以访问类的所有成员
- 需要在类内部用
friend关键字声明 - 定义在类外部,不需要使用类名和作用域解析运算符(:😃
声明方式
class MyClass {
private:
int privateData;
public:
// 声明友元函数
friend void friendFunction(MyClass &obj);
};
// 定义友元函数
void friendFunction(MyClass &obj) {
obj.privateData = 10; // 可以直接访问私有成员
}
使用场景
1. 访问多个类的私有成员
class Box; // 前向声明
class Widget {
private:
int size;
friend void compare(Widget &w, Box &b); // 友元函数
};
class Box {
private:
int volume;
friend void compare(Widget &w, Box &b); // 同一个友元函数
};
// 可以访问两个类的私有成员
void compare(Widget &w, Box &b) {
if (w.size > b.volume) {
cout << "Widget is larger";
}
}
2. 运算符重载
友元函数常用于运算符重载,特别是需要对称性的运算符:
class Complex {
private:
double real, imag;
public:
Complex(double r = 0, double i = 0) : real(r), imag(i) {}
// 声明友元运算符函数
friend Complex operator+(const Complex &c1, const Complex &c2);
};
// 定义运算符重载
Complex operator+(const Complex &c1, const Complex &c2) {
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
3. 提高性能
当函数需要频繁访问类的私有数据时,使用友元可以避免通过公有接口的额外开销。
注意事项
- 封装性破坏:友元函数破坏了类的封装性,应谨慎使用
- 单向关系:友元关系是单向的,A是B的友元不意味着B是A的友元
- 不可继承:友元关系不能被继承
- 不受访问控制:友元声明可以放在类的任何部分(private/public/protected)
友元类
除了友元函数,C++还支持友元类:
class A {
friend class B; // B是A的友元类
private:
int secret;
};
class B {
public:
void accessA(A &a) {
a.secret = 42; // B可以访问A的私有成员
}
};
最佳实践
- 只在必要时使用友元
- 优先考虑使用成员函数
- 对于需要对称性的运算符重载(如+、-、==等),友元函数是更好的选择
- 文档化友元关系,说明为什么需要这种特殊访问权限
友元函数是C++提供的一种灵活机制,合理使用可以在保持良好封装性的同时提供必要的灵活性。

浙公网安备 33010602011771号