使用友元函数的优缺点有哪些?

友元函数允许外部函数访问类私有或受保护成员,用于类间协作,提高代码灵活性,封装实现细节。缺点是破坏封装性,增加耦合,存在安全性问题。实战案例:counter 类使用友元函数 stats 来访问其受保护的 increment() 方法,从而进行协作。

使用友元函数的优缺点有哪些?

友元函数:优缺点及实战案例

友元函数是一种允许外部函数访问类中私有或受保护成员的特殊函数。它们通常用于支持类与其他类或函数之间的协作。

优点

实现类间协作:友元函数可以弥合不同类之间的沟壑,允许它们访问彼此的私有或受保护成员。提高代码灵活性:通过允许外部函数访问类成员,友元函数可以增加代码的灵活性并简化重构。封装实现细节:友元函数还可以封装特定类的实现细节,使其他类不必了解其内部工作原理。

缺点

破坏封装性:友元函数可以破坏类的封装性,因为它能让外部函数访问原本隐藏的成员。耦合问题:友元函数会增加类之间的耦合,因为一个类的更改可能会影响另一个类的友元函数。安全性问题:恶意代码可以滥用友元函数绕过类的安全措施。

实战案例

让我们以一个简单的 Counter 类为例,它用于计数对象:

class Counter {    private:        int count;    protected:        void increment() { count++; }};

为了让另一个类 Stats 访问 Counter 的受保护成员 increment(),我们可以将它声明为 Counter 类的友元函数:

class Stats {    public:        void analyze(Counter& counter) {            // Friend function can access protected method            counter.increment();        }};

在主函数中,我们可以看到友元函数如何协作:

int main() {    Counter counter;    Stats stats;    stats.analyze(counter);  // 友元函数被调用    return 0;}

以上就是使用友元函数的优缺点有哪些?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1447188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 00:19:26
下一篇 2025年12月7日 23:35:11

相关推荐

  • C++ 函数重载在多线程编程中的应用有哪些?

    通过函数重载,c++++ 多线程编程可以通过为不同线程提供定制的接口和实现来增强。它允许定义线程专用函数、保护共享数据、扩展线程功能,并通过分别分配数组部分,大大提高多线程排序等实际案例的性能。 C++ 函数重载在多线程编程中的应用 函数重载是 C++ 中一种允许函数具有相同名称但参数不同的特性。在…

    2025年12月18日
    000
  • C++ 中如何声明和使用友元函数?

    c++++ 中的友元函数是一种可访问其他类私有/受保护成员的特殊函数。声明友元函数时需使用 friend 关键字,如:声明友元函数:friend void printvalue(const myclass& obj);使用友元函数:友元函数可像普通函数一样使用,可以访问私有/受保护成员;实战…

    2025年12月18日
    000
  • C++ 函数的友元机制如何打破封装性?

    c++++ 中,友元机制打破封装,允许函数或类访问其他类的私有成员。通过使用 friend 关键字,可将函数声明为某个类的友元,从而访问其私有数据和方法。友元机制常用于解决类之间的循环依赖,例如允许构造函数互相成为友元,访问对方私有成员初始化对象。需要注意,友元机制会降低封装性,因此应谨慎使用,只将…

    2025年12月17日
    000
  • C语言和C++的异同对比

    C语言和C++的异同对比及代码示例 在计算机编程领域中,C语言和C++是两种非常重要的编程语言。它们都具有高效性和灵活性,适用于不同类型的应用程序开发。本文将对C语言和C++进行比较,并提供一些具体的代码示例,以便更好地理解它们之间的异同之处。 一、相同点: 两者都是面向过程的语言:无论是C语言还是…

    2025年12月17日
    000
  • MAUI怎么为视障用户做辅助功能开发 MAUI辅助功能教程

    MAUI无障碍开发关键在于正确设置控件的可访问名称、角色、状态及焦点顺序,并适配系统级无障碍设置。需用AutomationProperties.Name设语义化名称,动态更新状态,合理使用TabIndex,响应字体缩放与高对比度模式,全程结合TalkBack/VoiceOver测试。 MAUI 本身…

    2025年12月17日
    000
  • MAUI怎么监听网络状态变化 MAUI Connectivity教程

    MAUI 监听网络状态变化核心依赖 Microsoft.Maui.Essentials.Connectivity,它跨平台、免权限、无需原生代码;通过 NetworkAccess 判断互联网可达性(Internet/Local/None),用 ConnectivityChanged 事件实时响应变化…

    2025年12月17日
    000
  • Avalonia怎么创建一个托盘图标应用 Avalonia系统托盘程序

    Avalonia 11.1+ 原生支持 NativeTrayIcon,需升级至11.2+,配置平台依赖、设置菜单与图标资源,并确保 tray.Show() 调用;跨平台图标格式各异,未设菜单或资源路径错误是常见问题根源。 在 Avalonia 中创建托盘图标应用,核心是使用 NativeTrayIc…

    2025年12月17日
    000
  • MAUI怎么集成Maps地图控件 MAUI地图使用教程

    MAUI集成地图首选官方Microsoft.Maui.Controls.Maps(支持iOS/Android原生地图),需配置平台权限与XAML/C#代码;国内项目推荐高德Web方案(JS API+WebView),需申请Web Key并确保DOM加载完成后再初始化。 MAUI 集成地图控件主要有两…

    2025年12月17日
    000
  • MAUI怎么获取GPS地理位置 MAUI Geolocation教程

    MAUI获取GPS地理位置需满足设备支持、用户授权和平台配置三前提;离线可用但首次定位较慢。一、Android需在AndroidManifest.xml添加精确定位权限,iOS需在Info.plist配置NSLocationWhenInUseUsageDescription,Windows/macO…

    2025年12月17日
    000
  • C#怎么遍历枚举 C# Enum.GetValues遍历方法

    在C#中遍历枚举最常用方式是Enum.GetValues,返回Array类型,需显式转换为具体枚举类型或使用C# 7.3+泛型重载;配合GetNames可获取名称与值;Flags枚举需手动位运算生成组合值。 在 C# 中遍历枚举最常用、最直接的方式就是用 Enum.GetValues,它返回一个包含…

    2025年12月17日
    200
  • Blazor 怎么发起 HTTP 请求

    Blazor发起HTTP请求应使用注入的HttpClient而非new实例,以避免连接泄漏;Server端默认注册IHttpClientFactory,WASM端受CORS限制且需配置凭据支持;推荐封装API客户端服务并统一处理错误与加载状态。 Blazor 发起 HTTP 请求主要靠 IHttpC…

    2025年12月17日
    000
  • WPF如何实现多语言国际化 WPF本地化与资源文件使用方法

    WPF多语言国际化核心是用.resx文件按语言分组管理资源,通过强类型类绑定XAML,动态切换需修改CurrentUICulture并重载ResourceDictionary,支持字符串、图标、样式等本地化,部署时需确保卫星程序集正确发布。 WPF 实现多语言国际化,核心是把界面文本、图片等资源从代…

    2025年12月17日
    000
  • ASP.NET Core怎么实现全局异常处理 ASP.NET Core全局异常中间件

    ASP.NET Core 全局异常处理最常用方式是使用 UseExceptionHandler 和 UseDeveloperExceptionPage 中间件;前者用于所有环境并支持自定义错误响应,后者仅开发环境启用以显示详细错误页;需按顺序注册,结合日志记录与类型判断实现差异化处理。 ASP.NE…

    2025年12月17日
    000
  • 剖析C# XDocument.Load()与XDocument.Parse() 哪个更适合你的场景,如何排错

    XDocument.Load()用于从文件、URL等外部资源加载XML,涉及I/O操作;2. XDocument.Parse()用于解析字符串形式的XML内容,不支持路径或URI;3. 根据数据源选择方法:文件或网络地址用Load,字符串用Parse;4. 常见错误包括将路径传给Parse或对字符串…

    2025年12月17日
    000
  • C#如何操作Excel文件?NPOI与EPPlus两大类库使用教程与对比

    NPOI支持.xls和.xlsx格式,免费且无需Office;EPPlus仅支持.xlsx,功能强大但商业用途需授权。根据文件格式、许可证和功能需求选择合适工具。 在C#开发中,操作Excel文件是常见需求,比如导出报表、读取数据等。目前最流行的两个第三方库是NPOI和EPPlus。它们都功能强大、…

    2025年12月17日
    000
  • C# 枚举(enum)的最佳实践 – 如何优雅地处理枚举类型

    C#枚举最佳实践包括:明确适用场景、用[Flags]处理位域、避免magic number、添加DescriptionAttribute、考虑智能枚举类、统一JSON序列化为字符串、显式定义0值成员。 在 C# 开发中,枚举(enum)是一种非常实用的值类型,用于定义一组命名常量,提升代码可读性和维…

    2025年12月17日
    000
  • C# 如何克隆一个Git仓库 – LibGit2Sharp库的使用

    使用 LibGit2Sharp 克隆 Git 仓库需调用 Repository.Clone() 方法,支持 HTTPS、SSH 等多种协议;通过 CloneOptions 可配置认证、深度、分支、裸仓库等选项,注意 GitHub 需用 PAT 替代密码。 使用 LibGit2Sharp 克隆 Git…

    2025年12月17日
    000
  • C# 如何使用位运算(Bitwise Operations) – 提高性能和节省内存

    位运算在C#中直接操作整数二进制位,适用于性能敏感和内存受限场景;支持&、|、^、~、等运算符,常用于奇偶判断、2的幂检测、[Flags]枚举标志管理、位字段模拟等。 位运算在 C# 中能直接操作整数的二进制位,常用于性能敏感场景(如游戏、嵌入式、高频计算)和内存受限环境。它不依赖高级抽象,…

    2025年12月17日
    000
  • C#中的事件(event)如何使用 – 发布-订阅模式的经典实现

    C# 的 event 是对发布-订阅模式的原生支持,本质是受保护的委托字段,编译器自动生成私有委托及线程安全的 add/remove 访问器,确保外部只能订阅/取消订阅,不可直接触发或赋值,保障封装性与安全性。 C# 中的 event 是对发布-订阅(Publish-Subscribe)模式的原生支…

    2025年12月17日
    000
  • C# 如何进行异步文件I/O操作 – ReadAsync和WriteAsync

    ReadAsync和WriteAsync需配合FileOptions.Asynchronous创建FileStream才能真正异步,否则退化为同步;推荐复用ArrayPool.Shared缓冲区,File类静态方法适合小文件但不适用于超大文件。 在 C# 中,ReadAsync 和 WriteAsy…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信