news 2026/3/6 15:55:01

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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++ 的小伙伴!

我们下期见!👋

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 5:49:56

为客服系统赋能:接入anything-llm实现自动应答

为客服系统赋能&#xff1a;接入 AnythingLLM 实现自动应答 在企业服务的日常运转中&#xff0c;客服部门常常面临这样的窘境&#xff1a;一边是客户对“秒回”的期待越来越高&#xff0c;另一边却是人工坐席被重复性问题淹没&#xff0c;培训成本居高不下&#xff0c;回答口径…

作者头像 李华
网站建设 2026/2/25 7:35:56

VMD-Transformer-GRU组合模型锂电池剩余寿命预测(NASA电池数据集容量特征提取+RUL电池剩余寿命预测)MATLAB代码

代码功能 1. rongliangtiqu.m - 电池容量数据提取 主要功能&#xff1a; 从NASA电池数据集中提取放电容量数据并进行可视化分析 算法步骤&#xff1a; 导入四个电池数据集(B0005, B0006, B0007, B0018)遍历每个电池的循环数据&#xff0c;筛选放电循环提取放电容量数据并存…

作者头像 李华
网站建设 2026/2/24 1:17:22

wl_arm在过程控制中的典型架构:图解说明

从传感器到云端&#xff1a;一文讲透 wl_arm 在现代过程控制中的实战架构你有没有遇到过这样的场景&#xff1f;产线上的传统 PLC 看似稳定&#xff0c;但一旦要接入云平台、跑个预测性维护算法&#xff0c;或者扩展几十路模拟量输入时&#xff0c;立刻变得力不从心——通信慢、…

作者头像 李华
网站建设 2026/3/5 20:34:29

9 个降AI率工具,本科生高效降重指南

9 个降AI率工具&#xff0c;本科生高效降重指南 AI降重工具&#xff1a;高效降低AIGC率的得力助手 在当前学术写作中&#xff0c;越来越多的本科生开始使用AI工具辅助论文撰写。然而&#xff0c;随着各大高校对AI生成内容&#xff08;AIGC&#xff09;检测的重视&#xff0c;如…

作者头像 李华
网站建设 2026/2/28 4:04:20

制造业知识传承难题破解:工人培训AI助手上线

制造业知识传承难题破解&#xff1a;工人培训AI助手上线 在一家中型机械制造厂的装配车间里&#xff0c;一位刚入职三个月的新员工正面对一台从未接触过的数控机床。他记得师傅提过某个参数设置的关键点&#xff0c;但翻遍了厚厚的操作手册和班组微信群记录&#xff0c;依然找不…

作者头像 李华
网站建设 2026/3/2 10:21:06

SBC运行Linux RT系统的实时性优化指南

SBC运行Linux RT系统的实时性优化实战指南你有没有遇到过这样的场景&#xff1a;在一台树莓派上跑着控制电机的程序&#xff0c;明明代码逻辑清晰、周期设定精准&#xff0c;可实际执行时却总出现几毫秒甚至十几毫秒的抖动&#xff1f;机器人动作不连贯、传感器采样失步、Ether…

作者头像 李华