什么是友元(Friend)?👭

友元 (C++) | Microsoft Learn
在C++中,友元(Friend)是一种机制,允许外部函数或类访问某个类的私有(private)或保护(protected)成员。
⚠️⚠️友元不是类的成员,但它能绕过封装限制,直接访问类中的私有数据。
2. 友元函数的定义与作用🆙
  
 
普通成员函数的访问限制
假设有一个类
Person,如下所示:class Person { private: std::string name; int age; public: Person(std::string n, int a) : name(n), age(a) {} };在上面的例子中,
name和age是私有成员,一般情况下不能从类外直接访问。
友元函数如何访问私有数据
我们可以定义一个友元函数,允许它直接访问
Person类的私有成员:#include <iostream> using namespace std; class Person { private: std::string name; int age; public: Person(std::string n, int a) : name(n), age(a) {} // 声明友元函数 friend void displayPersonInfo(const Person& p); }; // 友元函数的实现 void displayPersonInfo(const Person& p) { std::cout << "Name: " << p.name << ", Age: " << p.age << std::endl; } int main() { Person p1("Alice", 30); displayPersonInfo(p1); return 0; }
解释:
-  friend关键字用于声明displayPersonInfo是Person类的友元函数。
-  虽然 displayPersonInfo不是Person类的成员,但它能访问name和age。
3. 友元类的概念与使用😮💨
除了友元函数,C++ 还允许一个类成为另一个类的友元,从而使该类的所有成员函数都能访问另一个类的私有成员。
友元类的示例:
#include <iostream> using namespace std; class Engine { private: int horsepower; public: Engine(int hp) : horsepower(hp) {} // 声明 Car 为友元类 friend class Car; }; class Car { public: void showEnginePower(const Engine& e) { std::cout << "Engine horsepower: " << e.horsepower << std::endl; } }; int main() { Engine engine(500); Car car; car.showEnginePower(engine); return 0; }
解释:
这里,Car 是 Engine 的友元类,因此 Car 的成员函数可以访问 Engine 的私有数据 horsepower。
4. 友元的实际案例:为什么以及何时使用?
典型使用场景:
重载运算符: 需要通过友元函数访问类的私有成员来实现运算符重载。
辅助调试或测试: 有时为了更方便地测试类中的私有数据,可以使用友元。
跨类协作: 当两个类高度耦合时,可以通过友元类减少重复代码
例子:运算符重载
class Complex { private: double real, imag; public: Complex(double r, double i) : 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); } int main() { Complex c1(1.0, 2.0), c2(3.0, 4.0); Complex c3 = c1 + c2; std::cout << "Real: " << c3.real << ", Imag: " << c3.imag << std::endl; return 0; }解释:
operator+是一个友元函数,用于访问Complex类的私有成员real和imag。
5. 注意事项⚠️
破坏封装性: 使用友元会暴露类的私有数据,容易破坏封装性,因此要慎用。
维护复杂性: 如果过多使用友元类或友元函数,类之间的耦合度会增加,导致代码难以维护。
6. 图解:类与友元的关系
图示:友元函数访问类的私有成员
说明:
图中展示了
Person类和displayPersonInfo友元函数的关系。即使name和age是私有的,displayPersonInfo仍然能访问它们。
复盘吧💪
-  友元函数和友元类允许类的私有成员对外开放,但应谨慎使用。 
-  友元机制非常适用于重载运算符或跨类访问数据的情况,但滥用可能导致代码的耦合性和维护成本增加。 
对类访问不是很理解的可以看这篇
C++类域访问方式(public,protected,private)对象访问 , 通过成员函数访问 ,通过友元函数访问-CSDN博客文章浏览阅读144次。C++类的域访问方式主要由访问修饰符控制。了解这些访问方式可以帮助我们设计更安全和可维护的类。通过合理的封装,可以有效保护数据的完整性。
https://blog.csdn.net/LJY_CF/article/details/143084393?spm=1001.2014.3001.5502
共勉 💪
同为未来的it人让我们在共同进步吧。
我很喜欢雷军的一段话:我们就悄悄的干,就算失败了咱也不丢人。



![[Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象](https://i-blog.csdnimg.cn/direct/cad370d7212242d792335eabc1823844.png)












![[论文笔记]HERMES 3 TECHNICAL REPORT](https://img-blog.csdnimg.cn/img_convert/f6423071e7a9cc56b3723d63450694cd.png)





