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

C++ 笔记 友元(面向对象)

C++ 笔记(面向对象):友元

在 C++ 面向对象的封装特性中,类会将私有成员(private)和保护成员(protected)隐藏起来,仅允许类自身的成员函数访问。但在实际开发中,我们有时需要让外部的函数或其他类,直接访问一个类的非公有成员 —— 这就是友元(friend)的作用。

友元是 C++ 提供的一种突破封装的机制,它允许外部函数或类访问另一个类的私有 / 保护成员。本文将从概念、分类、用法、优缺点四个维度,全面讲解友元的使用。

一、友元基础概念

1. 核心定义

友元:使用friend关键字声明的外部函数外部类,可以直接访问当前类的所有成员(包括 private、protected)。

2. 核心特点

友元不是类的成员,只是被类 “授权” 的外部对象;

友元可以是普通全局函数,也可以是其他类的成员函数,甚至是整个类

友元单向性:A 是 B 的友元,≠ B 是 A 的友元;

友元不传递:A 是 B 的友元,B 是 C 的友元,≠ A 是 C 的友元。

3. 友元的作用场景

让两个关联类高效共享数据;

重载运算符时(如<<>>),需要访问类的私有成员;

让工具函数直接操作类的内部数据,提升效率。

二、友元的三种分类

友元分为三类:友元全局函数友元成员函数友元类

1. 友元全局函数

普通全局函数声明为某个类的友元,该函数可直接访问类的私有成员。

代码示例
#include <iostream> using namespace std; class Person { // 声明全局函数 showAge 为 Person 类的友元 friend void showAge(Person& p); private: int age = 20; // 私有成员 }; // 友元全局函数:可以直接访问 Person 的私有成员 age void showAge(Person& p) { cout << "年龄:" << p.age << endl; } int main() { Person p; showAge(p); // 调用友元函数 return 0; }
关键点

友元声明写在类内部任意位置(public/protected/private 都可以);

函数本身是全局函数,不属于类。

2. 友元成员函数

另一个类的成员函数声明为友元,该成员函数可访问当前类的私有成员。

代码示例
#include <iostream> using namespace std; // 提前声明 Person 类 class Person; class Student { public: // 声明为 Person 的友元成员函数 void showPersonAge(Person& p); }; class Person { // 声明 Student 的 showPersonAge 为友元 friend void Student::showPersonAge(Person& p); private: int age = 22; }; // 实现友元成员函数 void Student::showPersonAge(Person& p) { cout << "Person的年龄:" << p.age << endl; } int main() { Person p; Student s; s.showPersonAge(p); return 0; }
关键点

必须提前声明类,否则编译器无法识别;

只有这一个成员函数有权限,不是整个类。

3. 友元类

整个类声明为友元,该类的所有成员函数都可以访问当前类的私有成员。

代码示例
#include <iostream> using namespace std; class Person { // 声明 Student 整个类为友元 friend class Student; private: int age = 23; string name = "小明"; }; class Student { public: // 可以访问 Person 所有私有成员 void show(Person& p) { cout << "姓名:" << p.name << endl; cout << "年龄:" << p.age << endl; } }; int main() { Person p; Student s; s.show(p); return 0; }
关键点
  • 友元类的所有成员函数都能访问私有成员;
  • 写法:friend class 类名;

三、友元的优缺点

优点

  1. 灵活方便:快速实现外部访问私有成员;
  2. 效率更高:避免频繁调用公有接口函数;
  3. 适配运算符重载:如cout << 对象必须用友元。

缺点

  1. 破坏封装性:类的私有成员不再安全;
  2. 降低代码可维护性:外部代码可直接修改内部数据;
  3. 耦合度变高:类与类、类与函数关联性太强。

四、使用建议

  1. 能不用就不用:优先用公有成员函数访问;
  2. 必须用时再用:运算符重载、紧密关联的类;
  3. 最小权限原则:优先用友元函数,少用友元类

总结

  1. 友元friend声明的外部函数 / 类,可访问类的私有成员;
  2. 三类友元:友元全局函数友元成员函数友元类
  3. 特点:单向、不传递、不是类成员
  4. 优点:灵活高效;缺点:破坏封装,谨慎使用。
http://www.cnnetsun.cn/news/1597642.html

相关文章:

  • 微信聊天记录永久保存:WeChatMsg让你的数字记忆永不消失
  • Palo Alto Panorama 11.2.8 Virtual Appliance for ESXi- Palo Alto Networks 防火墙统一管理
  • TongWeb部署SpringCloud微服务实战:Nacos注册与Gateway路由失效的解决方案
  • nq 开发者指南:从源码编译到自定义队列实现
  • google-translate-api最佳实践:构建企业级翻译服务的完整方案
  • 实战演练:基于快马平台构建virtualbox多机集群,模拟企业级微服务架构
  • 从零构建数控BUCK电源:基于STC32G的HSPWM驱动与PID闭环实战
  • 实战应用:基于快马ai构建含定时网页监控任务的openclaw自动化安装方案
  • IPv6地址配置实战:从理论到思科设备部署
  • OpenCVSharp摄像头开发避坑指南:C#实现高清录像+实时滤镜(WinForm版)
  • 终极指南:如何通过anyRTC-RTMP-OpenSource实现低延迟高并发的直播体验
  • 3步实现跨语言交互:开源翻译引擎的实时处理技术革新
  • 环世界卡顿顽疾突破:Performance-Fish革新性优化技术全解析
  • 从Java转行大模型应用,LlamaIndex基本概念学习
  • PyAEDT技术架构深度解析:构建工业级电磁仿真自动化平台
  • 解锁3大自由:5分钟掌握的音乐格式解放工具
  • AMD Ryzen硬件调试终极指南:3大突破性能优化秘籍揭秘
  • Qwen-Image-2512基础教程:Docker环境配置、模型挂载路径与显存优化设置
  • 终极指南:Laravel DataTables 分页与排序的深度实现原理
  • bilibili-parse视频解析工具使用指南
  • 【书生·浦语】internlm2-chat-1.8b开源模型:支持JSON Mode输出结构化结果实测
  • 告别混乱移植!LVGL v8.3输入设备(indev)对接保姆级指南:从触摸屏到编码器,一份代码搞定
  • AI预测蛋白质结构:从AlphaFold3到中国实践,一篇讲透
  • DeepSeek-R1-Distill-Qwen-7B优化升级:提升推理速度的技巧
  • Win11Debloat:终极Windows 11优化指南,让系统重获极速体验
  • 比迪丽AI绘图惊艳案例:长发/战斗服/微笑特写等12种经典姿态
  • 智能图像转文本OCR:Pix2Text让复杂文档识别变得简单
  • Plasma多架构支持对比:x86、ARM、MIPS反汇编特性分析
  • 3个秘密武器:如何用Obsidian主页模板打造你的专属知识管理中心
  • 智启核纪元:人工智能重构核工业的落地全景、价值变革与未来图景