3第三章类间关系程序.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于“自赋值” 所谓“自赋值”就是,当 class A { … }; A a,b; 之后写出的 a = a; 有人会说,谁会写出那么蠢的语句?! 的确,不会有人蠢到如此地步,可是不显式写出 a = a; 不能保证不写出隐含形式语句!如: c[i] = c[j]; 在 i==j 时就是 a = a;又如: *pa = *pb ; 在 pa 和 pb 指向同一对象时;还有更加隐晦的: void dosomething(Base rb, Derived * pd); 其中rb和*pd尽管类型不同,可是在公有继承下有可能是同一对象(别忘了类型兼容规则)。 总之, “自赋值”是防不胜防的事,而且发生的很隐晦。程序员的责任就是一定要写出“有免疫力”的程序,而不是让使用你程序的用户使用时战战兢兢如履薄冰。 友元 友元是C++提供的一种突破封装的机制。 通过将一个模块声明为一个类的友元,这个模块能够使用类中本是被隐藏的数据成员。 友元不是组合,定义和调用时不受类作用域限制。 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。 谚语:记住,朋友带来的麻烦往往多于便利! 友元分类 友元函数:将一个普通函数安插到类中,成为该类的“朋友”。于是这个函数就拥有了访问类中所有成员的特权。 友元成员函数:将一个类的某个成员函数安插到另一个类中,成为该类的“朋友”。于是这个函数就拥有了访问那个类中所有成员的特权。 友元类:将整个类安插到另外一个类中,成为该类的“朋友”。于是这个类的所有成员函数就拥有了访问该类中所有成员的特权。 这三种外来户都不是类的正式成员,都不受所在类的节制,都拥有任意访问类成员的特权。 友元函数 私有成员 公有成员 友元函数 主体类 友元成员函数 私有成员 公有成员 私有成员 公有成员 友元成员函数 主体类 另一个类 友元类 私有成员 公有成员 友元类 主体类 使用友元函数计算两点距离 class Point //Point类声明 { public: //外部接口 Point(int xx=0, int yy=0) {X=xx;Y=yy;} int GetX() {return X;} int GetY() {return Y;} friend double Distance(Point a, Point b); private: //私有数据成员 int X,Y; }; 使用友元函数计算两点距离 double Distance( Point a, Point b) { double dx=a.X-b.X; double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy); } int main(){ Point p1(3.0, 5.0), p2(4.0, 6.0); double d = Distance(p1, p2); coutThe distance is dendl; return 0; } 友元函数的调用! 没有友元将如何实现? 友元与普通函数的区别! class A { friend class B; public: void Display() {coutxendl;} private: int x; }; class B { public: void Set(int i); void Display(); 友元类举例 友元类 此二函数是何关系? 重载/重定义? private: A a; }; void B::Set(int i) { a.x=i; } void B::Display() { a.Display(); } 友元类举例 访问组合对象的私有成员正是友元的“特长”。 这是类的组合 友元关系的性质 友元关系是单向的 如果B类是A类的友元,则B类的函数可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据。(孙悟空钻进铁扇公主肚里。) 友元关系不能传递 如果B类是A类的友元, C类是B类的友元,若没特别声明,则 C类和A类无友元关系。 (朋友的朋友不见得是朋友!) 友元关系不能继承 如果B类是A类的友元, B类的子类不会自动成为A类的友元类。(借来的东西不是遗产。) 内嵌类:在类体内又定义一个类——内层类。外面的类称为外围类。内嵌类又称为“成员类”。 这个内嵌类以及由它创建的对象,都局限在外围类作用域中,并受外围类的访问权限所管辖。 内层类的成员函数对外围类的成员没有访问权,反之亦然。即使可用,也仍然要遵循“对象名

文档评论(0)

知识宝库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档