建设局网站上海网站建设公司

贵州博瑞鑫装饰工程有限公司 2026/09/09 20:24:43

🧑‍💻 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++ 的小伙伴!

我们下期见!👋

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

网站建设论文网站建设解决方案

Claude 现已引入 Skills 功能,显著提升了其执行特定任务的能力。Skills 本质上是一个包含指令、脚本和资源的结构化文件夹,Claude 能够根据任务需求动态

2026/06/30 10:35:51

网站建设入门三亚网站建设

还在为繁琐的CAD建模步骤而苦恼吗?想象一下,只需要几句话就能让计算机帮你完成专业级的三维设计。这不是科幻电影,而是Zoo Text-to-CAD为你带来的现

2026/06/30 11:16:54

贵州网站建设网站建设网站

Calibre豆瓣插件完整教程:如何5分钟实现电子书元数据自动化管理【免费下载链接】calibre-doubanCalibre new douban metadata source pl

2026/06/30 11:02:23

网站建设策划方案广西网站建设

一、退出要实现的操作(1)清理掉当前用户缓存数据(2)清理掉权限相关配置(3)返回到登录页二、主动退出主动退出指的是

2026/06/30 11:45:27

深圳网站建设公司容桂网站建设

从行业通用分类逻辑(按控制方式、功能定位、功率等级),电机驱动板的完整分类及核心区别如下,覆盖所有场景(不止你的 2804 无刷电

2026/06/30 11:57:28

网站建设教程济南营销型网站建设

树莓派串口通信调优实战:从波特率误差到稳定百万级数据传输你有没有遇到过这样的场景?树莓派连上GPS模块,定位信息断断续续;接了个高帧率LiDAR

2026/06/30 14:13:09

义乌网站建设贵州省建设厅网站

还在为Mac和Android设备间的文件传输而烦恼吗?传统的传输方式要么速度缓慢,要么操作复杂,让你在设备切换时倍感困扰。今天,我要向你推荐一个

2026/06/30 12:28:01

服装网站建设网站建设知识

第一章:农业传感器数据存储的挑战与PHP架构选型在现代农业系统中,传感器网络持续采集土壤湿度、气温、光照强度等关键数据,这些数据具有高频次、高并发和持久化写入

2026/06/30 11:43:57

诸城网站建设郴州网站建设

过去两年,“AI 智能体(AI Agent)” 这个词汇在各类技术会议、学术论文中高频亮相。有人称它是 “下一代操作系统”,也有人断言它将 “颠

2026/06/30 11:55:28

甘肃省建设厅网站贵州建设厅网站

简介本文提出了医疗AI智能体的六大核心模块框架:感知、对话接口、交互系统、工具集成、记忆学习和推理。通过七种专业智能体类型(如ReAct+RAG、自学习、记忆增强等

2026/06/30 13:37:36