分享好友 最新动态首页 最新动态分类 切换频道
C++学习笔记-友元函数的定义与使用
2024-12-26 16:04

在C++中,友元函数(Friend Function)是一个独特而强大的特性,它打破了类的封装性,允许一个或多个非成员函数访问类的私有(private)和保护(protected)成员。尽管这种特性在某些情况下可能引发争议,因为它违反了面向对象编程中的封装原则,但在需要高效访问类内部状态或实现某些特定设计时,友元函数却又非常适用。

C++学习笔记-友元函数的定义与使用

1.1 封装与友元函数的关系

在面向对象编程(OOP)中,封装是一种将数据(属性)与操作这些数据的函数(方法)绑定在一起的方法。封装的主要目的是隐藏类的内部实现细节,只对外提供有限的接口供外部使用。然而,在某些情况下,我们可能希望允许某些特定的非成员函数访问类的私有成员。这时,友元函数就显得尤为重要了。

1.2 友元函数的概念

友元函数不是类的成员函数,但它可以访问类的所有私有(private)和保护(protected)成员。要使一个函数成为类的友元,需要在类定义中声明该函数为友元。友元函数可以是普通函数,也可以是其他类的成员函数。

2.1 定义友元函数

在类定义中,使用friend关键字可以声明一个或多个友元函数。友元函数的声明可以放在类的任何位置(但通常放在类定义的开始部分,但它们的定义(实现)必须在类定义之外进行。

示例

 

在上面的示例中,printValue函数被声明为MyClass的友元函数,因此它可以访问MyClass对象的私有成员value。

2.2 友元函数的特性

非成员函数:友元函数不是类的成员函数,因此它不会隐式地接收类的this指针。
访问权限:友元函数可以访问类的所有成员,包括私有和保护成员。
作用域:友元函数的作用域不是类的作用域,而是定义它的作用域。但是,它可以通过类的对象来访问类的成员。
数量不限:一个类可以有任意数量的友元函数。
不继承:友元关系不是继承的。如果类B是类A的友元,那么类B的子类不会自动成为类A的友元。

2.3 友元成员函数

除了普通函数外,类的成员函数也可以被声明为其他类的友元函数。这允许一个类的成员函数访问另一个类的私有成员。

示例

 

注意,在声明友元成员函数时,需要先对目标类进行前向声明,因为编译器在解析MyClassA的类定义时需要知道MyClassB是一个类名。

3.1. 重载操作符

友元函数最常见的用途之一是用于重载操作符,特别是当操作符需要访问类的私有或保护成员时。例如,在自定义的复数类(Complex)中,你可能想要重载<<操作符以便能够直接将复数对象输出到流中。由于输出操作需要访问复数对象的实部和虚部(这些通常是私有成员,因此将<<操作符定义为复数类的友元函数是一个很好的选择。

3.2. 辅助函数

有时,我们可能需要一些辅助函数来帮助实现类的功能,但这些函数并不适合作为类的成员函数。例如,如果有一个表示二维图形的类(如圆形或矩形,我们可能需要一个函数来计算两个图形是否相交。这样的函数可能需要访问图形的私有成员(如中心坐标和半径或边界,但将这些功能作为类的成员函数可能并不合适,因为它们并不是图形对象本身的操作。这时,可以将这些辅助函数声明为类的友元函数。

3.3. 模板类中的友元

在模板类中,友元函数的使用变得更加复杂但也更加有用。模板类的友元可以是另一个模板类或非模板类,甚至可以是模板函数。这允许模板类与非模板代码或不同类型的模板代码之间进行更紧密的交互。例如,你可能有一个模板容器类,并希望提供一个模板化的友元函数来执行某种类型的算法,这个算法需要访问容器的内部数据结构。

3.4. 访问控制绕过

虽然这通常不是推荐的做法,但在某些特殊情况下,友元函数可以用来绕过类的访问控制,以提供对私有成员的访问。这可以在需要优化性能(如避免通过公共接口访问时产生的额外开销)或实现特定设计模式(如访问者模式)时非常有用。然而,过度使用友元可能会破坏封装性,使代码更难理解和维护。

3.5. 跨类访问

最新文章
AI生成PPT,让你的演示文稿更轻松!
近年来,AI技术的飞速发展给我们的生活带来了很多便利。AI不仅可以在医学、金融等领域有突破性的应用,还可以帮助我们提高工作效率。在演示文稿的制作过程中,是一个令人兴奋的创新。那么,什么是?如何使用它?本文将为你详细解答。AI生成
bing搜索引擎地址链接是什么-bing搜索引擎入口网址分享
必应bing搜索引擎是一个非常不错的工具,bing搜索引擎地址链接是什么,这是大家都不太了解的,感兴趣的可以来看看bing搜索引擎入口网址分享!bing搜索引擎入口网址一览:国内版引擎入口:https://cn.bing.com/谷歌搜索引擎退出中国市场之后
AIGC绘画设计基础:干货满满!Stable Diffusion提示词! 从入门到精通之提示词手册,免费分享,零基础首选!
Stable Diffusion 技术把 AI图像生成提高到了一个全新高度,文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好。本文从“如何写好提示词”出发,从提示词构成、调整规则和 AIGC辅助工具等角度,对
2024新奥156期精准资料|经典解释落实0.573098953
新奥156期精准资料解析与经典解释落实策略——以数字0.573098953为中心随着时代的进步与发展,新奥集团作为行业领军者,不断追求卓越与创新,在其内部运营与管理中,精准资料的获取与利用显得尤为重要,本文将围绕新奥集团第156期的精准资
2024 年 11 月头号恶意软件:Androxgh0st 位居榜首,危害物联网设备和关键基础设施
Check Point 软件技术公司的比较新威胁指数报告揭示了与 Mozi 整合的僵尸网络 Androxgh0st 风头正盛,Joker 和 Anubis 威胁持续存在,网络犯罪手段在不断演进。网络安全解决方案先驱者和全球掌舵者Check Point® 软件技术有限公司(纳斯达
4.DESIGN, STRENGTH AND LIFETIME OF AIRCRAFT ENGINES/航空发动机的结构设计、强度与寿命
为推进我校教育国际化进程,扩大航空动力专业国际影响,提升国际化办学水平,助力教育国际合作。2022年6月27日至8月26日,动力与能源学院开展“在线暑期国际学堂”,力邀来自来自俄罗斯、乌克兰、德国、法国、日本、英国、西班牙、荷兰、瑞
AI智能文案一键生成:全面覆创意写作、营销推广与内容策划需求
在数字化时代内容创作已成为企业传和建设的要紧手。面对繁重的内容创作任务怎样增强效率、减低成本同时保证内容优劣成为了多企业和创作者的难题。智能文案自动生成技术的出现为这一难题提供了完美的应对方案。本文将为您介绍智能文案一键生
331期[朱宝翔]P5十位信心杀码
331期朱宝翔体彩P5十位信心杀码:238 独杀1码:3 开:330期朱宝翔体彩P5十位信心杀码:059 独杀1码:5 开:81136[十位:3]329期朱宝翔体彩P5十位信心杀码:058 独杀1码:5 开:14780[十位:8]328期朱宝翔体彩P5十位信心杀码:246 独杀1码:4 开:12504[十
360清理大师极客版
        360清理大师极客版拥有6年清理经验,能瞬间扫描并清理上百兆手机垃圾,轻松为手机瘦身。除了在手机内存清理、内存管理的功能强大之外,360清理大师极客版的操作也很简单,界面清新,小白也能轻松上手,一键解决手机空间不足的
相关文章
推荐文章
发表评论
0评