Appearance
友元
- 向别人开权限,将别人设置成朋友,允许别人访问自己所有权下的成员
友元函数
全局函数作为友元函数
- 允许该函数访问自己所有权限下的成员,包括私有成员
- 格式
friend fun() - 友元函数并非是类成员函数,没有
this指针
cpp
class MyClass {
public:
MyClass(int value) : m_value(value) {}
friend void PrintValue(const MyClass& obj); //友元函数的声明
private:
int m_value;
};
// 友元函数的定义
void PrintValue(const MyClass& obj) {
std::cout << "The value of the object is: " << obj.m_value << std::endl;
}
int main() {
MyClass obj(42);
PrintValue(obj); // 直接调用友元函数
return 0;
}类的成员函数作为友元函数
- 要求该函数类内声明,类外定义
cpp
class B;
class A {
int val;
public:
A(int v) : val(v) {}
// 把类的方法作为友元函数
friend void B::Print(const A& obj);
// 把整个类当作友元类
friend class B;
};
class B {
public:
void Print(const A& obj) {
cout << "The value of A is: " << obj.val << endl;
}
};
int main() {
A a(42);
B b;
b.Print(a);
return 0;
}友元类
- 声明一个类作为自己的友元类,允许类中所有的成员函数访问自己的成员
注意事项
- 单向性,A 能访问 B,但 B 不能访问 A
- 不具传递性,A 能访问 B,B 能访问 C,但 A 不能直接访问 C
- 不具继承性,父类的友元不一定是子类的友元
- 尽少使用友元,破坏了类的封装性
- 必须使用友元的情况:插入和提取运算符重载的时候