友元函数和友元类的特性
- 友元函数:
- 友元函数不是类的成员函数,但它可以访问类的私有和保护成员。
- 友元函数的声明需在类定义中使用
friend
关键字。
- 它不受类的访问控制符限制,可以在类的任何位置声明。
- 友元类:
- 若一个类
B
被声明为另一个类A
的友元类,那么类B
的所有成员函数都可以访问类A
的私有和保护成员。
- 友元关系是单向的,若
B
是A
的友元类,并不意味着A
是B
的友元类。
- 友元关系不能传递,若
B
是A
的友元类,C
是B
的友元类,并不意味着C
是A
的友元类。
代码示例
#include <iostream>
class A {
private:
int privateVariable;
public:
A(int value) : privateVariable(value) {}
// 声明友元函数
friend void accessPrivate(A& obj);
};
// 友元函数定义
void accessPrivate(A& obj) {
std::cout << "The private variable value is: " << obj.privateVariable << std::endl;
}
int main() {
A a(10);
accessPrivate(a);
return 0;
}
常见应用场景
- 运算符重载:当运算符的左操作数不是该类的对象时,可能需要使用友元函数来实现运算符重载。例如,实现
ostream& operator<<(ostream& os, const ClassName& obj)
来支持自定义类的输出操作。
- 辅助类:某些辅助类需要频繁访问另一个类的私有成员,将辅助类声明为友元类可以方便地实现这种访问。例如,一个用于调试的类可能需要访问被调试类的私有状态。
- 数据结构关联:在一些复杂的数据结构中,不同的数据结构类可能需要相互访问对方的私有成员,通过友元关系可以实现这种紧密的交互。