- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c第8章友元
第7章 友 元 OOP主张程序的封装、数据的隐藏,但任何事情都不是绝对的,例如,一个家,总是要通过防盗门、门锁等不让外人进入,但是,在特殊情况下,如全家出游,又需要检查煤气、水电,就可以把钥匙托付给可以信赖的邻居 ——朋友(友元)——可以访问你家的私有数据成员 信息隐藏: 数据成员私有; 通过公有的成员函数访问 问题引入: 条件:类外函数需要频繁地访问类的数据成员 目的:提高程序效率 方法:友元(friend) 友元 友元函数 友元类 目录 7.1 友元函数 7.2 友 元 类 7.3 友元应用实例 7.1 友元函数 友元的声明在类内 friend 类型 友元函数名(参数表); 注:友元函数说明可在类的任何部位,意义完全一样。 友元函数的定义一般在类外 (一般与类的成员函数定义放在一起) 注意 友元函数可直接访问该类的所有成员(公有的、私有 的、保护的),但它不是成员函数,它可以像普通函数一样 在任何地方调用。 [例7.1] [例7.2] 求一个点到直线的距离。 点类Point,点坐标——用两个数据成员x和y表示(因为要在类外使用,所以设计为公有的)。 直线类Line,直线方程 为ax2+bx+cx=0,系数用三个私有数据成员a、b和c表示 设计一个函数dist(参数为Point和Line)计算一个点(x,y)到直线ax2+bx+cx=0的距离d公式如下。 7.2 友元类 friend class [例7.3] [例7.4]实现一个栈——后进先出 要求: 实现栈的压入(入栈)和弹出(出栈)。 设计(用链表实现栈): 结点类node,它包含结点值data和指向上一个结点的指针prev; 栈类stack,它包含栈的头指针top。 生成的链式栈如图7.1所示 改进 友元friend小结 友元的声明在类内,定义一般在类外 包括(友元函数、友元类) class A { … friend int f(int a); //友元函数 friend class B; //友元类 } int f(int a) {… } Class B {…. } 友元的单向性和非传递性 单向性:B是A的友元类,并不意味A也是B的友元 非传递性:C是B的友元类, B是A 的友元类,并不意味C是A的友元类 7.3 友元应用实例——[例7.5] 银行(自学) 设计三个类 中国银行类Cbank 工商银行类Bbank 农业银行类GBank。 每个类都包含 一个私有数据balance:存放储户在该行的存款数, 一个友元函数total:计算储户在三家银行总存款数 程序 7.3友元应用实例——[例7.6]合并排序 设计类 numset:输入一个整数数序,并按从小到大排列且不包含相同元素。 设计友元函数unionset:合并两个有序数序 bool Stack::isnull() { if(top==NULL) return true; else return false; } 调用: while(!s.isnull()) { couts.pop()“ ”; } 法2:修改pop,带引用参数,并修改返回值为bool类型 bool Stack::pop(int i) { int *n=top; if (n!=NULL) { i=n-data; top=top-prev; delete n; return true; } return false; } while(s.pop(i)) { couti“ ”; } 完整程序如下: #include iostream.h class Node{ private: int data; Node *prev; public: Node(int d,Node *n):data(d),prev(n){}; friend class Stack; }; class Stack{ private: Node *top; public: Stack(){top=NULL;} ~Stack(); void push(int i); int pop(); bool pop(int i); bool Stack::isnull(); }; void Stack::push(int i){ Node *n=new Node(i,top); top=n; }; int Stack::pop(){ Node *t=top; if(top!=NULL){ top=top-prev; int c=t-data; delete t; return c; }; return 0; }; bool Stack::p
您可能关注的文档
最近下载
- 第十章正交试验设计.ppt VIP
- 鲁拜集(黄克孙郭沫若对照).pdf VIP
- (2025秋新版)青岛版三年级科学上册《5 .制作动物分类图册》PPT课件.pptx VIP
- 2025年(精品)成都七中学校自主招生考试试题 .pdf VIP
- 小学二年级新学期家长会班主任发言稿.docx VIP
- 现浇箱梁专项施工方案.doc VIP
- 北师大版数学二年级下册 长方形与正方形.ppt VIP
- QFSN-600-2型发电机铁心损坏分析 Analysis on Damage of QFSN-600-2 Generator Core.pdf VIP
- 小学二年级新学期家长会班主任发言稿.pdf VIP
- 小箱梁吊装履带吊安拆方案.docx VIP
文档评论(0)