友元的概念和定义(精)
友元函数及友元类
友元函数及友元类已有 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、计算机与计算器最根本的区别在于前者( )。
自学材料之二:对类友元的理解
C++程序员的婚礼背景:1995 年 1 月,我的两个朋友,达瑞和卡娜,私奔海外(其实只是从澳洲跑到 了旧金山)。
他们要到剑桥去继续他们的学业,下面这个典礼就是为他们举行的一系 列告别活动的一部分。
这都是原始材料。
友元关系结成典礼[*]蒂姆。
麦肯齐和罗伯特。
休厄尔 1995 年 8 月 27 日这一庆典是对 1959 年新教婚礼仪式的拙劣模仿[1].今天,在这所旅馆中,达瑞和卡娜自愿结为友元关系。
既然此事并不违背现行法律, 典礼现在开始。
上帝保佑,我们大家,包括旅馆的职员,能聚集在此地,参加卡特丽娜。
伊丽莎白。
麦菲与达瑞。
马克。
普拉特的友元关系结成大典。
尽管此前他们已经举行过了正式的婚礼,但那是在我们大家都没有听说过的遥远的 地方,背着我们举行的婚礼。
既然大家提不出任何反对他们结合的合法的理由,那 就让我们虔诚地默念此次典礼的程序、目标和约定吧。
神圣的友元关系起源于文明萌芽时代,是由布亚那。
斯特思塔普于 20 世纪 70 年代 最早提出的。
布亚那发明的 C++语言完全符合图灵模型,具备面向对象的特征。
他 为 C++语言祈祷并赐予它支配万物的力量。
进而,布亚那又说:“类不应该总是孑然一身;我得想办法帮帮它。
”于是,他创建了友元声明的语法,并以此允许其他的类或函数访问类的私有或受保 护的成员。
“这样,一个类就可以超越它的基类,并服务于它的友元类和友元函数, 可以与它的友元类和友元函数合为一体。
”我们尊贵的主 ANSI 用他的祝福和他制订的律条为友元关系赐予了无上的荣耀。
他 同意接纳友元关系,并把友元关系作为永久的和光荣的协约,写入神圣律令之中。
他宣布:“布亚那所整合的特征,没有人能将其再次分开。
”使徒戴米安在他写给克 莱顿的青年信徒的信中,使用友元关系创建了相互连接的类,并以此显示了友元关 系的优越性能。
这一典故可以在神圣历代记《C++语言的高级白痴》[3]第 8 章第 56 节中找到。
友元函数
友元函数友元函数友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。
类授予它的友元特别的访问权。
通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
目录友元函数(friend)?友元函数要在一个类体内说明,形式为:友元函数(friend)?友元函数要在一个类体内说明,形式为:展开友元函数(friend)?定义格式(c++):friend <返回类型> <函数名> (<参数列表>);分清成员函数,非成员函数和友元函数成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。
所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。
关于这一点就这么简单。
如果函数不必是虚拟的,情况就稍微复杂一点。
(条款38: 决不要重新定义继承而来的缺省参数值)举例看下面表示有理数的一个类:class rational {public:rational(int numerator = 0, int denominator = 1);int numerator() const;int denominator() const;private:...};这是一个没有一点用处的类。
(用条款18的术语来说,接口的确最小,但远不够完整。
)所以,要对它增加加,减,乘等算术操作支持,但是,该用成员函数还是非成员函数,或者,非成员的友元函数来实现呢?当拿不定主意的时候,用面向对象的方法来考虑!有理数的乘法是和rational类相联系的,所以,写一个成员函数把这个操作包到类中。
class rational {public:...const rational operator*(const rational& rhs) const;};(如果你不明白为什么这个函数以这种方式声明——返回一个const值而取一个const的引用作为它的参数——参考条款21-23。
友元 复习资料
5.3
友元应用实例
int Result(Myclass& x) {
x.max*x.maxreturn x.max*x.max-x.min*x.min;
例4:求两数的平方差。 求两数的平方差。 <iostream. #include <iostream.h> class Myclass { private: private: a,b,max,min; int a,b,max,min; public: public: Myclass(int i, j): int j):a(i),b(j) { max=(a>b)?a:b; max=(a>b)?a: min=(a<b)?a: min=(a<b)?a:b; }
class B { //A的所有成员函数均为 的所有成员函数均为B friend class A;//A的所有成员函数均系不可以被继承。假设类A是类B的友元,而类C 友元关系不可以被继承。假设类A是类B的友元,而类C从类 B派生,如果没有在类C中显式地使用下面的语句: 派生,如果没有在类C中显式地使用下面的语句: friend class A; 那么,尽管类A是类B的友元, 那么,尽管类A是类B的友元,但这种关系不会被继承到 也就是说, 和类A没有友元关系, 类 C , 也就是说 , 类 C 和类 A 没有友元关系 , 类 A 的成员函数 不可以直接访问类C的受保护成员和私有成员。 不可以直接访问类C的受保护成员和私有成员。 不存在“ 友元的友元” 这种关系。 假设类A 是类B 的友元, 不存在 “ 友元的友元 ” 这种关系 。 假设类 A 是类 B 的友元 , 而类B是类C的友元,即是说类B的成员函数可以访问类C 而类 B 是类 C 的友元 , 即是说类 B 的成员函数可以访问类 C 的 受保护成员和私有成员, 而类A的成员函数可以访问类B 受保护成员和私有成员 , 而类 A 的成员函数可以访问类 B 的 受保护成员和私有成员;但是, 受保护成员和私有成员;但是,类A的成员函数不可以直接 访问类C的受保护成员和私有成员, 访问类C的受保护成员和私有成员,即友元关系不存在传递 性。 (见例2:友元类) 见例2 友元类) 见例3 节点类和栈类的友元关系) (见例3:节点类和栈类的友元关系)
c++ 结构operator用法
c++ 结构operator用法摘要:一、C++结构简介1.结构的概念2.结构的定义与使用3.结构与类的区别二、C++结构中的成员变量1.成员变量的定义2.成员变量的访问权限3.成员变量的初始化三、C++结构中的成员函数1.成员函数的定义与使用2.成员函数的重载3.成员函数的访问权限四、C++结构中的友元函数1.友元函数的概念2.友元函数的定义与使用3.友元函数的访问权限五、C++结构中的运算符重载1.运算符重载的概念2.运算符重载的语法3.运算符重载的例子正文:C++结构operator 用法详解C++是一种支持面向对象编程的语言,结构是C++中一种基本的复合数据类型。
结构可以将不同类型的数据组合在一起,以满足复杂数据结构的需求。
在C++结构中,我们可以使用运算符来对结构进行操作。
本文将详细介绍C++结构中operator 的用法。
一、C++结构简介结构是一种用户自定义的数据类型,它由一组成员变量和成员函数组成。
结构可以用来封装和组织相关联的数据,使程序的设计更加模块化和清晰。
在C++中,结构与类非常相似,但它们之间存在一些区别。
结构主要用于封装数据,而类则更注重封装方法和数据。
此外,类的成员默认是私有的,而结构的成员默认为公有的。
二、C++结构中的成员变量在C++结构中,成员变量是结构的重要组成部分。
成员变量可以分为数据成员和成员函数。
数据成员是结构中实际存储的数据,而成员函数则是对结构中的数据进行操作的函数。
在定义结构时,我们可以为结构成员指定访问权限,如public、private 和protected。
此外,我们还可以在结构体定义时对成员变量进行初始化。
三、C++结构中的成员函数成员函数是C++结构中的重要组成部分,它们用于对结构中的数据进行操作。
我们可以为结构定义成员函数来实现特定的功能,如访问、修改和操作结构中的数据。
成员函数可以重载,以实现不同的功能。
同时,我们还可以通过访问权限控制成员函数的可见性。
c语言中友元的定义
c语言中友元的定义友元是C语言中的一种特殊的关系,它允许一个类或函数访问另一个类的私有成员。
在C++中,友元是通过关键字“friend”来实现的。
但在C语言中,由于没有类的概念,所以友元的定义略有不同。
一、友元的概念及作用1.1 友元的定义在C语言中,友元可以被理解为两个函数之间或者一个函数和一个变量之间建立起来的特殊关系。
这种关系允许其中一个函数或变量访问另一个函数或变量的私有成员。
1.2 友元的作用友元主要用于解决以下问题:(1)保护类成员:C语言中没有类这个概念,但是我们可以通过结构体来模拟。
结构体中可以包含公有成员和私有成员,私有成员只能在结构体内部访问。
如果我们想让另外一个函数或者变量也能够访问到这些私有成员,就需要使用友元。
(2)提高效率:如果两个函数需要频繁地进行数据交换,而这些数据又需要保护起来不被外界访问,那么我们就可以使用友元来提高效率。
二、友元的使用方法2.1 声明方式在C语言中,我们可以通过在函数或变量前面加上“extern”关键字来声明一个友元。
例如:extern void function1();extern int variable1;2.2 定义方式在C语言中,我们可以通过在函数或变量前面加上“static”关键字来定义一个友元。
例如:static void function2();static int variable2;2.3 访问方式当我们需要访问另一个函数或变量的私有成员时,可以使用以下方式:(1)将需要访问的私有成员设置为公有成员。
(2)将需要访问的函数或变量声明为友元。
三、友元的注意事项3.1 友元的使用应该谨慎虽然友元可以方便地访问私有成员,但是过度使用会破坏封装性和安全性。
因此,在使用友元时应该谨慎考虑。
3.2 友元不具备继承性如果一个类A是另一个类B的友元,那么类A并不会继承类B的私有成员。
因此,在使用友元时要注意这一点。
3.3 友元不能被继承如果一个类A是另一个类B的友元,那么子类C并不能继承这个特权。
C++中友元详解
C++中友元详解2008-09-01 21:28:47分类:C/C++问题的提出我们已知道类具备封装和信息隐藏的特性。
只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。
非成员函数能够访问类中的公有成员,但是假如将数据成员都定义为公有的,这又破坏了隐藏的特性。
另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程式的运行效率。
为了解决上述问题,提出一种使用友元的方案。
友元是一种定义在类外部的普通函数,但他需要在类体内进行说明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。
友元不是成员函数,但是他能够访问类中的私有成员。
友元的作用在于提高程式的运行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。
友元能够是个函数,该函数被称为友元函数;友元也能够是个类,该类被称为友元类。
友元函数友元函数的特点是能够访问类中的私有成员的非成员函数。
友元函数从语法上看,他和普通函数相同,即在定义上和调用上和普通函数相同。
下面举一例子说明友元函数的应用。
#include#includeclass Point{public:Point(double xx, double yy) { x=xx; y=yy; }void Getxy();friend double Distance(Point &a, Point &b);private:double x, y;};void Point::Getxy(){cout<<"("<<<","<<<")"<< FONT>}double Distance(Point &a, Point &b){double dx = a.x - b.x;double dy = a.y - b.y;return sqrt(dx*dx+dy*dy);}void main(){Point p1(3.0, 4.0), p2(6.0, 8.0);p1.Getxy();p2.Getxy();double d = Distance(p1, p2);cout<<"Distance is"<<< FONT>}说明:在该程式中的Point类中说明了一个友元函数Distance(),他在说明时前边加friend关键字,标识他不是成员函数,而是友元函数。
第10章 静态成员与友元
C++程序设计
1.1 静态数据成员
C++ 中,同一个类定义多个对象时,每个对象拥 有各自的数据成员(不包括静态数据成员),而所有 对象共享一份成员函数和一份静态数据成员。静态数 据成员是类的所有对象中共享的成员,而不是某个对 象的成员,因此可以实现多个对象间的数据共享。静 态数据成员不属于任何对象, 它不因对象的建立而产 生,也不因对象的析构而删除,它是类定义的一部分, 所以使用静态数据成员不会破坏类的隐蔽性。 对静态数据成员的操作和一般数据成员一样,定 义为私有的静态数据成员不能由外界访问。静态数据 成员可由任意访问权限许可的函数访问。可以在类的 成员函数中改变静态数据成员。
C++程序设计
1 静态成员
类相当于一个数据类型,当说明一个某类 的对象时,系统就为该对象分配一块内存单元 来存放类中的所有成员。但在某些应用中,需 要程序中属于某个类的所有对象共享某个数据。 为此,一个解决的办法就是将所要共享的数据 说明为全局变量,但这将破坏数据的封装性; 较好的解决办法是将所要共享的数据说明为类 的静态成员。
C++程序设计
1.2 静态成员函数
静态成员函数的定义和其他成员函数一样。但在 说明时需注意静态成员函数不得说明为虚函数。静态 成员函数与静态数据成员类似,也是从属于类,静态 成员函数的定义是在一般函数定义前加上 static关键字。 调用静态成员函数的格式如下: <类名>::<静态成员函数名>(<参数表>); 静态成员函数与静态数据成员一样,与类相联系, 不与对象相联系,只要类存在,静态成员函数就可以 使用,所以访问静态成员函数时不需要对象。如果用 对象去调用静态成员函数,只是用其类型。
C++模拟试题_1-2
CPP程序设计模拟考试 1--第2套试卷1.c++系统预定了4个用于标准数据流的对象,下列选项中不属于此类对象的是(____)A.coutB.cinC.cerrD.cset正确答案:【D】分值:【1】2.设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为(____)A.floatB.charC.intD.double正确答案:【D】分值:【1】3.下列对析构函数的描述中,正确的是(____)A.一个类中只能定义一个析构函数B.析构函数名与类名不同C.析构函数的定义只能在类体内D.析构函数可以有一个或多个参数正确答案:【A】分值:【1】4.下列定义数组的语句中正确的是(____)A.#define size 10 char str1[size],str2[size+2];B.char str[];C.int num['10'];D.int n=5; int a[n][n+2];正确答案:【A】分值:【1】5.关于this指针使用说法正确的是(____)A.保证每个对象拥有自己的数据成员,但共享处理这些数据的代码B.保证基类私有成员在子类中可以被访问。
C.保证基类保护成员在子类中可以被访问。
D.保证基类公有成员在子类中可以被访问。
正确答案:【A】分值:【1】6.所谓多态性是指(____)A.不同的对象调用不同名称的函数B.不同的对象调用相同名称的函数C.一个对象调用不同名称的函数D.一个对象调用不同名称的对象正确答案:【B】分值:【1】7.派生类构造函数的执行顺序是先执行________ 的构造函数,然后执行成员对象的构造函数,最后执行________ 的构造函数。
正确答案:【基类或派生类】分值:【1】8.C++语言程序的注释可以出现在程序中的任何地方,一个注释以________ 作为开始和结束的标记。
正确答案:【/**/】分值:【1】9.下列程序在构造函数和析构函数中申请和释放类的数据成员int *a,申请时使用形参b初始化a,请填空。
友元
Static类数据成员和成员函数独立于类对象而存在 类数据成员和成员函数独立于类对象而存在
static 类成员
访问static 类变量 访问
public static变量 变量 可以用二元作用域运算符通过类名访问(::) 可以用二元作用域运算符通过类名访问
Student::count
private static 变量 当不存在类成员对象时
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 40
cout << "\n\nStudent 1: " << s1Ptr->getFirstName() << " " << s1Ptr->getLastName() << "\nStudent 2: " << s2Ptr->getFirstName() << " " << s2Ptr->getLastName() << "\n\n"; delete s1Ptr; // recapture memory s1Ptr = 0; // disconnect pointer from free-store space delete s2Ptr; // recapture memory s2Ptr = 0; // disconnect pointer from free-store space cout << "Number of Students after deletion is " << Student::getCount() << endl; return 0; }
C++基础-友元专题
C++基础-友元专题发信站: 南京大学小百合站 (Thu Dec 23 15:46:36 2010)友元友元提供了在不同类的成员函数之间、类的成员函数与一般函数之间进行数据公享的机制。
通过友元关系,一个普通函数或一个类中的成员函数可以访问其他类中的私有和保护成员。
声明为友元的外界对象既可以是不属于任何类的一般函数,也可以是另一个类的成员函数,还可以是整个类(此时该类中的所有成员函数都称为友元函数)。
友元函数在类中说明友元函数的一般格式为:friend <类型><友元函数名>(<参数列表>) ;在<参数列表>中,通常包含一个与该友元函数具有友元关系的类的类型的参数,该参数可以是一般类型、指针类型或引用类型,但通常为引用类型。
友元函数的定义和调用方式与一般函数一样,只是在类中要进行友元声明。
1.友元函数并不是相应类的成员函数,由于它没有隐含的*this指针,所以它不能象成员函数那样直接访问和修改类的成员。
2.友元函数必须在类的定义中说明,其函数体可在类体外定义,也可在类体内定义,在类体外定义时,在函数的前面不要加作用域运算符“::”,也不要加关键字friend,它可以通过参数,或对象访问该类中的所有成员(公有的、私有的和保护的)。
而一般函数只能访问类中的公有成员。
3.友元函数不是类的成员函数,所以不受类中访问权限的限制,可以把它放在类的私有部分、公有部分或保护部分,其作用都是一样的。
4.友元函数不是类的成员函数,所以它的作用域与成员函数不同。
不管在类体外定义还是在类体内定义友元函数,友元函数的作用域都与一般函数的作用域相同。
如例1中的友元函数都具有文件作用域,可在程序中的任何位置调用它。
5.如果类中有指针类型的数据,且用动态方式分配,则在友元函数中该类类型的参数都要是引用类型,否则在运行时会出错。
6.友元函数是一种外部函数访问类中私有成员或保护成员的有效工具,如果使用不当,则是非常危险的。
友元函数
1.4 将一个函数(全局或成员的)声明为多个类的友元函数
在这种情况下,该函数可以同时访问多个类的 private 成员。
class Date; //对 Date 类的提前引用声明 class Time{ public: Time(int=1,int=1,int=1); friend void call(Time&,Date&);//声明函数 call 为本类的友元成员函数 private: int hour; int min; int sec; }; class Date{ public: Date(int=1,int=1,int=2008); friend void call(Time&,Date&); //声明函数 call 为本类的友元成员函数 private: int year; int mon; int day; }; Time::Time(int h,int m,int s){ hour=h; min=m; sec=s; } Date::Date(int m,int d,int y){ mon=m; day=d; year=y; } void call(Time &t,Date &d) {
cout<<"TIME:"<<t.hour<<"-"<<t.min<<"-"<<t.sec<<endl; cout<<"DATE:"<<d.mon<<"-"<<d.day<<"-"<<d.year<<endl; } int main(){ Time t; Date d; call(t,d); system("PAUSE"); return EXIT_SUCCESS; }
- 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的友元,要看在类中是否有 相应的声明。