友元的概念和定义(精)
友元函数及友元类

友元函数及友元类已有 20621 次阅读 2009-5-9 15:43 |个人分类:C/C++什么是友元(friend)?允许另一个类或函数访问你的类的东西。
友元可以是函数或者是其他的类。
类授予它的友元特别的访问权。
通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
分清成员函数,非成员函数和友元函数成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。
所以,如果有个函数必须进行动态绑定,就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。
关于这一点就这么简单。
如果函数不必是虚拟的,情况就稍微复杂一点。
Ø类的主要特点之一是数据隐藏,即类的私有成员只能在类定义的范围内使用,也就是说私有成员只能通过它的成员函数来访问。
Ø但是,有时候需要在类的外部访问类的私有成员。
为此,就需要寻找一种途径,在不放弃私有数据安全性的情况下,使得类外部的函数或类能够访问类中的私有成员,在C++中就用友元作为实现这个要求的辅助手段。
ØC++中的友元为数据隐藏这堵不透明的墙开了一个小孔,外界可通过这个小孔窥视类内部的秘密,友元是一扇通向私有成员的后门。
Ø友元可分为:友元函数,友元成员,友元类。
Ø友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员和公有成员。
Ø在类定义中声明友元函数时,需在其函数名前加上关键字friend。
此声明可以放在公有部分,也可以放在私有部分。
友元函数可以定义在类的内部,也可以定义在类的外部。
1.友元函数虽然可以访问类对象的私有成员,但它毕竟不是成员函数。
因此,在类的外部定义友元函数时,不必像成员函数那样,在函数名前加上“类名::”。
2.友元函数一般带有一个该类的入口参数。
因为友元函数不是类的成员,所以它不能直接引用对象成员的名称,也不能通过this指针引用对象的成员,它必须通过作为入口参数传递进来的对象名或对象指针来引用该对象的成员。
友元关系式

友元关系式
友元关系是指两个人之间既有友谊又有亲密感,但彼此之间没有情感或性关系。
友元关系常见于朋友之间,特点包括彼此信任、互相支持、喜欢一起做活动并享受彼此的陪伴。
友元关系可以建立在共同的兴趣、价值观和目标基础上,通过相互了解、支持和接纳,不断培养和加强。
友元关系对于个人的成长和幸福感有很大的影响,能够提供情感支持、鼓励和帮助,同时也能为人们带来快乐、愉悦和满足感。
友元关系应建立在平等、尊重、理解和包容的基础上,需要双方共同努力来维持和发展。
面向对象程序设计(C++)信息对抗技术教学大纲-

《面向对象程序设计(C++)》课程教学大纲课程代码:110242204课程英文名称:Object-Oriented Programming(C++)课程总学时:32 讲课:32 实验:0 上机:0适用专业:信息对抗技术专业大纲编写(修订)时间:2017年5月一、大纲使用说明(一)课程的地位及教学目标本课程是信息对抗技术专业的一门专业课。
本课程主要介绍C++语言的基本概念、基本语法和编程方法,面向对象的程序设计方法,以及Visual C++ 6集成开发环境。
通过本课程的学习学生应该熟悉和掌握Visual C++语言的面向对象的重要特征:如类、对象、继承、封装和多态性。
本课程的教学任务是使学生掌握一门高级程序设计语言,使学生最终能够阅读、分析、编写C++程序。
掌握面向对象程序设计的基本概念与方法,进而学会利用C++语言解决一般应用问题,为以后的学习和工作打下坚实的基础。
(二)知识、能力及技能方面的基本要求通过对本课程的学习,应使学生达到下列基本要求:1.了解C++语言的基本概念、基本语法和编程方法,同时重点介绍面向对象的特征;2.掌握类、对象、继承、封装和多态性;3.理解C++语言对C语言的扩充以及类和对象、友元、继承与派生、多态性和虚函数、C++语言的输入输出流库、异常处理、Windows编程基础和MFC编程基础、对话框和控件、菜单和文档/视图结构、图形设备接口。
(三)实施说明1.教学方法:面向对象程序设计主要采用讲授与实验相结合的方式进行,教师结合多媒体课件等教具边讲边教,有助于理解和记忆。
2.教学手段:本课程属于专业课,在教学中应与实际控制系统应用相结合,提高学生的学习兴趣。
由于学时的限制,课程实验由学生在课外完成。
(四)对先修课的要求本课程主要的先修课程是C语言程序设计。
(五)对习题课、实践环节的要求1.每部分内容均安排习题及思考题。
通过作业使学生能够对学习的内容真正了解掌握,使学生具有编程的能力。
友元函数和友元类的定义及使用

友元函数和友元类的定义及使用C++实验报告实验名称友元函数和友元类的定义及使用实验目的理解对象与类的关系,掌握对象的创建和使用掌握构造函数、析构函数的概念及使用方法掌握内存的动态分配的概念和使用方法掌握对象数组和对象指针掌握函数调用中参数的传递掌握友元函数和友元类的定义及使用class 类名 {private:数据成员或成员函数protected:数据成员或成员函数public:数据成员或成员函数};实验内容有Distance类和Point类,将Distance类定义为Point类的友元类来实现计算两点之间距离实验代码// point.hclass Distance;class Point{public:Point(int xx=0,int yy=0){X=xx;Y=yy;}friend class Distance;private:int X,Y;};class Distance{public:float fDist(Point a,Point b);};//point.cpp#include"iostream"#include"math.h"using namespace std;#include"point.h"#include"math.h"int _tmain(int argc, _TCHAR* argv[]){Point myp1(1,1),myp2(4,5);Distance d;cout<<"The distance is: ";cout<<d.fdist(myp1,myp2)<<endl;< p=""> return 0;}float Distance::fDist(Point p1,Point p2) {double x,y;x=p1.X -p2.X ;y=p1.Y -p2.Y ;return float(sqrt(x*x+y*y));}心得体会通过本次试验,让我更加熟练运用了友元函数和友元类的定义及使用,加快了学习的进程,知识的掌握实验名称运算符重载实验目的理解为什么要进行运算符重载,在什么情况下进行运算符重载。
友元问题

• 看到区别了吗?
• 我们注意到必须要修改函数定义内部对于 String 类私有数据成员的引用方式,因为新 的等于操作符是全局函数不是类成员函数, 它不能直接引用String 的私有数据成员,因 而它使用访问成员函数size()和c_str()来获得 String 对象的大小以及底层的C 风格字符串;
• 只有当一个类的定义已经被看到时,它的 成员函数才能被声明为另一个类的友元 (即一个类的成员函数被声明为友元的条 件是,该类的定义必须在被声明为友元之 前)而这并不总是能够做到的。
• 例如: 如果Screen 类必须把Window 类的成员函数声 明为友元,而Window类必须把Screen 类的成员函数 声明为友元,该怎么办呢?在这种情况下,可以把整个 Window类声明为Screen 类的友元,例如 • class Window; • class Screen { • friend class Window; • // ... • }; • Screen 类的非公有成员现在可以被Window 的每 个成员函数访问。
•
友元声明的最常见用法是:允许非成员的 重载操作符访问一个视其为朋友的类的私有成 员,原因是除了提供左和右操作数的对称性外, 非成员的重载操作符就像成员函数一样能够完 全访问一个类的私有成员。 • 虽然友元声明的主要用处是在重载操作符 上,但是在某些情况下,如一个完整的类必须 声明为友元在使一个类成为另一个类的友元时, 友元类的成员函数被赋予访问授权类的非公有 成员的权利。
如何判断是类的友元
• 有人可能会说,在这种情况下由于c_str()和 size()是内联的,它们提供了等价的效率, 并且保留了成员封装所以没必要直接访问 _size 和_string ,这是对的,使用成员访问 函数而不是直接访问成员,并不总是意味 着它的效率较低,由于存在这些访问函数 所以在这里没有必要把等于操作符声明为 String 类的友元。
友元模板函数

友元模板函数一、友元函数的概念和作用友元函数是指在类的定义中使用关键字friend声明的非成员函数,它能够访问类的私有成员,并且在类外被调用。
友元函数可以是全局函数,也可以是其他类的成员函数,它们能够提供更灵活的操作方式,增强了类与外部世界的交互性。
友元函数可以用来完成一些辅助操作,例如重载输入输出运算符<>,使得对象可以以更直观的方式进行输入和输出。
除此之外,友元函数还可以访问类的私有成员,突破类的封装,实现一些特殊的操作。
二、友元模板函数的定义和使用方法友元模板函数是在类的定义中使用friend声明的模板函数。
友元模板函数的定义方式与普通的友元函数相似,但是可以使用模板参数,使得函数具有更广泛的适用性。
友元模板函数通常与类模板一起使用,用来处理类模板中的私有成员,提供更灵活的操作。
通过友元模板函数,我们可以在类内部使用模板参数来访问和操作私有成员,实现更加通用的功能。
在类中声明友元模板函数时,需要在函数前面加上模板参数列表,并在函数名前加上friend关键字。
例如:template <typename T>class MyClass {public:// 声明友元模板函数template <typename U>friend void friendTemplateFunction(const MyClass<U>& obj);};三、友元模板函数的使用场景1.类模板的友元:友元模板函数常常用于类模板中,以便访问类模板中的私有成员。
在类模板中声明友元模板函数,可以让友元函数与类模板的实例化类之间共享私有成员,方便进行操作。
2.类模板的特化:友元模板函数可以用于类模板的特化。
我们可以通过友元模板函数来访问和操作特定类型的私有成员,实现特定类型的功能。
通过友元模板函数的特化,可以扩展类模板的功能,使其适用于更多的场景。
3.类与外部函数的交互:有时候,类需要与外部函数进行交互,完成一些特殊的操作。
第4章-C++面向对象程序设计(Visual C++ 2010版)-温秀梅-清华大学出版社

现小在孔C,P外U速界度可越以来通越过快这个的小今孔天窥我视们类并内不部推的荐秘使密用。它, 但它作为C++ 一个必要的知识点,一个完整的组成部 分,我友元们分还为是友需元要函讨数论、一友下元的成。员和友元类三种。
{ cout<<"the center of the circle is : "
<<c1.center.x <<","<<c1.center.y ;
cout<<" the radius is : "<<c1.radius<<endl;
}
关于友元函数的说明:
5. 成员函数和友元函数具有同等的特权(100% 的), 主要的区别在于调用形式不同。友元函数的调用形式与普
4.2 友元函数
在类中声明一个普通函数,在前面加上friend修饰, 那么这个普通函数就成了该类的友元函数,可以访问该 类的一切成员 。
class Circle { struct point{ int x,y;}center;
int radius; public:
…… double getArea(); double getDistance();
6.友元综函合数举在例类1:中在说ci明rc,le但类其中名使字用的友作元用域在类外,
作元请用说记域明的可住开以:始代点替友在该元说函函明数数点的函,本数结身说束是明点一和。个类如名果普相在通同说函明。数友因,元此时,由给友类
授权,出了使该它函成数为的类函的数体友代元码函,数则,它是且内仅联是的该。类的友元。而 一个普通7.函一数个函本数身可无以法成把为自多己个定类的义友为元友函元数函,数因,而可因以为访这 样做无问多意个义类,的同成时员也。 违背了数据隐藏原则。
2022年-2023年卫生招聘考试之卫生招聘(计算机信息管理)题库附答案(典型题)

2022年-2023年卫生招聘考试之卫生招聘(计算机信息管理)题库附答案(典型题)单选题(共40题)1、关于计算机病毒的叙述中,正确的选项是A.计算机病毒只感染.exe或.com文件B.计算机病毒可以通过读写软盘、光盘或Internet网络进行传播C.计算机病毒是通过电力网进行传播的D.计算机病毒是由于软盘片表面不清洁而造成的【答案】 B2、Internet2可以连接到现在的Internet上,但其宗旨是组建一个为其成员组织服务的专用网络,初始运行速率可以达到( )。
A.51.84mbpsB.155.520MbpsC.2.5GbpsD.10Gbps【答案】 D3、一位北京的用户通过邮局给山西的朋友寄了一封信,北京市邮政局完成的昌企业生产过程中的( )。
A.出口阶段B.进口阶段C.转口阶段D.本口阶段【答案】 A4、对一个国家进行信息化程度测的方法有多种,其中由美国人提出的相对简单易行的测定方法称为( )。
A.劳动力结构法B.信息化指数法C.国际电信联盟法D.信息社会指标法【答案】 A5、目前使用的微机是基于( )原理进行工作的。
A.存储程序和程序控制B.人工智能C.数字控制D.集成电路【答案】 A6、下面是对VFP帮助文件的叙述,正确的是A.VisualFoxPr0的“典型安装”方式自动安装帮助文件B.VisualFoxPr0“典型安装”后,按Fl功能键将获得帮助C.VisualFoxPr0的“典型安装”方式不会自动安装帮助文件D.VisualFoxPr0的帮助文件名为Foxhelp.txt【答案】 C7、为了防止病毒传染到3.5英寸的软盘片上,正确的方法是( )。
A.打开盘片片角上的小方口B.将盘片保存在清洁的地方C.不要将盘片与写有病毒的盘片放在一起D.关闭盘片片角上的小方口【答案】 A8、网络操作系统的系统容错技术中不包括( )A.硬盘镜像B.事务跟踪系统C.电源备份D.用户鉴权【答案】 D9、计算机与计算器最根本的区别在于前者( )。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 .在下面有关友元函数的描述中,正确的说法 是: A.友元函数是独立于当前类的外部函数 B .一个友元函数不能同时定义为两个类的友 元函数 C.友元函数必须在类的外部定义 D.在外部定义友元函数时,必须加关键字 friend
友元函数是一种说明在类定义体内的非成员函
数。 friend 〈返回值类型〉〈函数名〉(〈参数表〉) {〈函数体〉} 说明: (1) 友元函数是在类中说明的一个函数,它不是该 类的成员函数,但允许访问该类的所有成员。它是 独立于任何类的一般的外界函数。友元并不在类的 范围中,它们也不用成员选择符(.或->)调用,除非 它们是其它类的成员。
第4章 友元
4.1 友元的概念和定义
4.2 友元函数 4.3 友元成员 4.4 友元类 4.5 友元综合举例
4.1 友元的概念和定义
一个对象的私有数据成员和成员函数只 能在类定义的范围内使用,也就是说只能 通过它的公有成员函数来访问。 数据隐藏给两个类共享同一函数或数据 带来了额外开销,这是因为每次访问这些 共享内容都需要通过函数调用来完成。
使用friend关键字,友元提供了在不同类的 成员函数之间、类的成员函数与一般函数之间进 行数据共享的机制。通过友元,一个普通函数或 另一个类中的成员函数可以访问类中的私有成员 和保护成员。 友元的正确使用能提高程序的运行效率,但 破坏了类的封装性和数据的隐蔽性,导致程序可 维护性变差,因此一定要谨慎使用。 友元分为友元函数、友元成员和友元类三种, 友元声明可放在类的公有、私有或保护部分,结 果是一样的。
友元函数的ቤተ መጻሕፍቲ ባይዱ明:
(2) 由于友元函数不是类的成员,所以没有 this指针,访问该类的对象的成员时,必须 使用对象名,而不能直接使用类的成员名。 (3) 虽然友元函数是在类中说明的,但其名字 的作用域在类外,作用域的开始点在说明点, 结束点和类名相同。因此,友元说明可以代 替该函数的函数说明。 (4) 如果在说明友元时给出了该函数的函数体 代码,则它是内联的。
遵循一定规则而使对象以外的软件系统能够 不经过消息方式而直接访问对象内封装的数据成 员的技术方法便是友元。友元是面向对象系统与 过程系统衔接的纽带。 例4.1 没有使用友元时的学生成绩管理系统。 友元函数定义则在类的外部,一般与类的成 员函数定义放在一起。因为类重用时,一般友元 是一起提供的。
4.2 友元函数
友元函数的举例:
【例4.2】友元函数的定义和使用一。 【例4.3】友元函数的定义和使用二。 【例4.4】友元函数的定义和使用三(自学)。
4.3 友元成员
另一个类的成员函数可以作为某个类的友 元,只是在声明友元函数时要加上成员函数所 在的类名,称为友元成员。声明如下: friend 类名∷成员函数名; 与上一种友元比较,此种友元的存取范围 要小得多。因为这里的友元函数只是一个类中 的一个成员,friend授权该函数可以访问宣布 其为友元的类中的所有成员。 【例4.5】友元成员
4.5 友元综合举例
【例4.8】定义复数Complex类,使用友元 函数,完成复数的加法、减法、乘法运 算,以及对复数的输出。
习题:
1. 友元的作用是什么? 2. 友元概念的引入虽然方便了类之间的 数据共享,但是否削弱了对象的封装性? 3.友元的作用之一是: A.提高程序的运行效率 B.加强类的封装性 C.实现数据的隐藏性 D.增加成员函数的种类
4.4 友元类
某一个类可以是另一个类的友元,这 样作为友元的类中的所有成员函数都可以 访问另一个类中的私有成员。友元类的说 明方式如下: friend class 〈类名〉; 【例4.6】友元类一。(自学) 【例4.7】友元类二。
注意:
(1) 友元关系不具有传递性。假设类 A 是类 B 的 友元,类B是类C的友元,除非在类C中声明了类 A是它的友元类,否则类A并不是类C的友元。 (2) 友元关系是单向的,不具有交换性。假设 类A是类B的友元(即在类B定义中声明A为友元 类),类B是否是A的友元,要看在类中是否有 相应的声明。