当前位置: 首页 > news >正文

C++ 友元(friend)到底是什么?

🧑‍💻 C++ 友元(friend)到底是什么?好基友才能进卧室!

大家好!今天我们来聊一个 C++ 中既实用又有点“特别”的概念 ——友元(friend)

如果你刚学完封装、访问控制(public / private),可能会觉得:“私有成员只能类内部访问,那外面就完全不能碰了吗?”
别急,C++ 给我们留了一扇“后门”——友元。它就像你家的卧室(private),虽然一般外人不能进,但你可以特许你的好闺蜜、好基友进去!


🏠 生活中的类比

  • 客厅(public):谁都能进。

  • 卧室(private):只有你自己能进。

  • 但!如果你信任某个朋友,你可以给他/她一把钥匙 —— 这就是友元

在 C++ 中,友元可以让某些特定的函数或类访问另一个类的私有(private)成员

关键字只有一个:friend


✨ 友元的三种实现方式

1️⃣ 全局函数做友元

class Building { //告诉编译器 goodGay全局函数 是 Building类的好朋友,可以访问类中的私有内容 friend void goodGay(Building * building); public: Building() { this->m_SittingRoom = "客厅"; this->m_BedRoom = "卧室"; } public: string m_SittingRoom; //客厅 private: string m_BedRoom; //卧室 }; void goodGay(Building * building) { cout << "好基友正在访问: " << building->m_SittingRoom << endl; cout << "好基友正在访问: " << building->m_BedRoom << endl; } void test01() { Building b; goodGay(&b); } int main(){ test01(); system("pause"); return 0; }

goodGay是一个普通函数,但它被声明为Building的友元,所以能直接访问m_BedRoom


2️⃣ 类做友元

class Building; class goodGay { public: goodGay(); void visit(); private: Building *building; }; class Building { //告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容 friend class goodGay; public: Building(); public: string m_SittingRoom; //客厅 private: string m_BedRoom;//卧室 }; Building::Building() { this->m_SittingRoom = "客厅"; this->m_BedRoom = "卧室"; } goodGay::goodGay() { building = new Building; } void goodGay::visit() { cout << "好基友正在访问" << building->m_SittingRoom << endl; cout << "好基友正在访问" << building->m_BedRoom << endl; } void test01() { goodGay gg; gg.visit(); } int main(){ test01(); system("pause"); return 0; }

✅ 整个goodGay类都被授权访问Building的私有成员!


3️⃣ 成员函数做友元

class Building; class goodGay { public: goodGay(); void visit(); //只让visit函数作为Building的好朋友,可以访问Building中私有内容 void visit2(); private: Building *building; }; class Building { //告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容 friend void goodGay::visit(); public: Building(); public: string m_SittingRoom; //客厅 private: string m_BedRoom;//卧室 }; Building::Building() { this->m_SittingRoom = "客厅"; this->m_BedRoom = "卧室"; } goodGay::goodGay() { building = new Building; } void goodGay::visit() { cout << "好基友正在访问" << building->m_SittingRoom << endl; cout << "好基友正在访问" << building->m_BedRoom << endl; } void goodGay::visit2() { cout << "好基友正在访问" << building->m_SittingRoom << endl; //cout << "好基友正在访问" << building->m_BedRoom << endl; } void test01() { goodGay gg; gg.visit(); } int main(){ test01(); system("pause"); return 0; }

✅ 注意!这里只有visit()是友元,visit2()就不能访问m_BedRoom—— 精准授权,安全又灵活!


⚠️ 使用友元的小提醒

  • 友元破坏了封装性,所以不要滥用!

  • 它是 C++ 提供的一种“特例机制”,用于在必要时突破访问限制。

  • 常用于操作符重载、工具函数、测试代码等场景。


💡 总结

类型

谁能访问私有成员?

全局函数做友元

指定的全局函数

类做友元

整个友元类的所有成员

成员函数做友元

仅指定的那个成员函数

记住:友元不是成员函数,但它拥有“特权”!


📚 学完这篇,是不是对friend更清楚了?快去试试写自己的“好基友”吧!

👉 如果你觉得这篇文章对你有帮助,欢迎点赞、在看、转发给正在学 C++ 的小伙伴!

我们下期见!👋

http://www.gsyq.cn/news/143959.html

相关文章:

  • Windows 11下Multisim安装操作指南
  • 浏览器兼容性测试:Chrome/Firefox/Safari表现对比
  • 计费模式设计参考:借鉴anything-llm做商业化变现
  • 【RocketMQ 】核心技术详解:架构、可靠性、集群、持久化及与Kafka对比
  • 技术演进中的开发沉思-269 Ajax:拖放功能
  • P1478 陶陶摘苹果(升级版)题解
  • DeepSeek-Coder vs Copilot:嵌入式开发场景适配性对比实战
  • 操作指南:Intel平台启用USB 3.2高速模式
  • anything-llm插件生态展望:未来可能的扩展方向
  • 低延迟要求场景优化:缓存机制与预加载策略
  • 如何评估anything-llm的知识库回答准确性?
  • Altium Designer生成Gerber用于工厂生产的细节解析
  • 场效应管放大电路分析:模拟电子技术基础完整示例
  • 引用溯源功能:每个答案都能追溯原始文档
  • 手把手教你完成vivado安装与环境配置
  • 20 个 Kubernetes 运维技巧:支撑生产级集群稳定运行的实践清单
  • 整合多种大模型的AI终端:anything-llm扩展性分析
  • RLVR:2025年大模型训练的新范式,解锁模型推理能力
  • 轻松上手!anything-llm图形化界面操作全攻略
  • 基于多波束技术的卫星通信系统matlab性能仿真
  • 2025中国电缆一线品牌推荐:十大品牌榜单,缆标杆品牌盘点(12月更新) - 品牌2026
  • 安全采集jvm
  • iPhone 18系列明年Q1试产:首发A20系列芯片
  • 支持Ollama本地模型服务:anything-llm无缝对接方案
  • AI大模型排行网址、各大AI平台网址
  • 开源AI应用推荐:anything-llm让知识管理更简单
  • 什么是 ACPI Bridge Device
  • 如何用anything-llm实现文档智能检索与对话交互?
  • 基于单片机的多路温湿度采集与WIFI智能报警控制系统设计
  • 基于Python+大数据+SSM基于深度学习的淘宝用户购物可视化与行为预测系统(源码+LW+调试文档+讲解等)/淘宝用户分析系统/购物行为预测系统/用户购物可视化系统/电商用户行为预测