第4章类和对象 二 -2_第1页
第4章类和对象 二 -2_第2页
第4章类和对象 二 -2_第3页
第4章类和对象 二 -2_第4页
第4章类和对象 二 -2_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、4.5 友 元,引入友元的原因:当需要在类外访问私有成员时,需要一种途径,在不放弃私有成员数据安全性的情况下,使得类外可以访问私有成员。 作用:友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。即通过友元,一个普通函数或类的成员函数可以访问封装于某一个类中的数据,这就相当于给类的封装挖了一个小小的孔,把数据的隐蔽掀开了一个小小的角。通过它,可以看到类内部的一些属性。 主要是用于提高程序运行效率,可方便编程。,友元概念:一个类或一个函数是另一个类的朋友(friend)。 友元的三种形式: 1. 当一个类B是另一个类A的友元时,类称B是类A的友元类,称类A是B的宿主类。

2、 2当一个函数是一个类的友元时,称该函数是类A的友元函数。 3当一个类只限定另一个类中的某个或某些成员函数是自己的友元时,也可只定义这些成员函数是自己的友元成员函数。 友元的合理使用:它破坏了类的封装性和面向对象程序设计的信息隐藏的原则 。,4.5.1 友元函数,友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。 在类中声明格式: 在函数原型前加“friend ”,例4.22 友元函数的使用。 #include #include class girl public: girl(char *n,int d) name=n

3、ew charstrlen(n)+1; strcpy(name,n); age=d; friend void disp(girl ,说明: 1.友元函数在类内类外都可以定义,但在类外定义时,不必像成员函数那样加类名: 2.友元函数一般带有一个类的入口参数,因为它是外部函数,对类中成员访问时无this指针,所以它不能直接引用对象成员的名字,需要通过入口参数传递过来的对象名或对象指针引用该对象的成员。 .声明友元的语句可以在类中任何一个访问权限下,4.5.2 友元成员函数,一个类的成员函数也可以作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的所有成员,还可以访问friend声明语句所

4、在类对象中的所有成员。 作用:能使两个类相互合作、协调工作,完成某一任务。,例4.24 一个类的成员函数作为另一个类的友元。 #include #include class girl; class boy public: boy(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; void disp(girl ,class girl public: girl(char *n,int d) name=new charstrlen(n)+1; strcpy(name,n); age=d; friend void boy:d

5、isp(girl ,void main() boy b(Chen Hao,25); girl e(Zhang Wei ,18); b.disp(e); 程序运行结果如下: Boys name is Chen Hao ,age: 25 Girls name is: Zhang Wei ,age: 18,说明: 1.一个类的成员函数是另一个类的友元函数时,必须先定义这个类。 2.“Class 类名;”为向前引用。,4.5.3 友元类,一个类也可以作为另一个类的友元。 例如: class Y / ; class X / friend Y; / 声明类Y为类X的友元类 / ;,说明: 1.友元类可以放

6、在类定义的任意位置,他不受类的存取权限的影响 。 2.一旦定义了,则友元类的所有的成员函数均可用“”运算符调用宿主类 A的私有成员 3.定义时的语句次序必须正确,先定义友元类,再定义宿主类,反之则不行。 不能在友元类中自己定义自己是宿主类的友元类。 4.友元类和宿主类之间不具有相互性,例如,如果定义了A是B的友元类,则B不是A的友元类; 5.友元类不能传递 6.友元类不能继承,4.6 对象成员,如果一个类的对象是另一个类的数据成员,则称这样的数据成员为对象成员。例如: class A /. ; class B A a; /类A的对象a为类B的对象成员 public: / ;,一、类嵌套和子对象

7、 类嵌套:用其它类的对象作为一个类的数据成员。 外层类:包含对象数据成员所属的类。 内层类:对象数据成员所属的类。 子对象:外层类包含的内层类的对象。 注意:由于系统无法自动调用内层类的构造函数为外层类对象中的子对象赋初值,因此需要在设计外层类的构造函数时,显式调用内层类的构造函数,为外层类对象中的子对象赋初值。,二、外层类的构造函数 类X的构造函数的定义形式为: X:X(形参表):对象成员名1(形参表1), 对象成员名i(形参表i) ,对象成员名n(形参表n) / 构造函数体 两种方法: 以基本数据类型的形式变量参数为子对象初始化赋值; 内层对象类的形式对象参数为子对象初始化赋值。,#inc

8、lude class point private: int x,y; public: point(int xx,int yy) x=xx; y=yy; cout”point constructing”endl; void printp() coutx yendl; point()cout”point destructing”endl;,class line point a,b; public: line(int x1,int y1,int x2,int y2 ):a(x1,y1),b(x2,y2) cout”line constructingendl” line(point p1,point

9、p2):a(p1),b(p2) cout”line constructingendl” / line():a(),b() void printl() a.printp(); b.printp(); line(void)cout”line destructing”endl;,void main() line l1(1,1,5,5); L1.printl(); point a(2,2),b(3,3); line l2(a,b); l2.printl();,说明: 1当调用构造函数时,首先按各对象成员在类声明中的顺序依次调用它们的构造函数,对这些对象初始化。最后调用构造函数体;析构函数顺序刚好相反。

10、 2声明一个含有对象成员的类,首先要创建各成员对象。 3在外层类中声明内层的构造函数时,必须写对象成员的名字而不能写类名。,47 常类型,4.7.1 常引用 如果在说明引用时用const修饰,则被说明的引用为常引用。 常引用的说明形式如下: const 类型说明符 其中,b是一个常引用,它所引用的对象不允许更改。但是a是可以修改的。,例4.28 常引用作函数形参。 #include int add(const int /在函数中不能修改i和j的值。,4.7.2 常对象,如果在说明对象时用const修饰,则被说明的对象为常对象。 常对象的说明形式如下: 类名 const 对象名(参数表); 或者

11、 const 类名 对象名(参数表); 说明:在定义对象时必须进行初始化,而且不能被更新。,例4.29 #include class Sample public: int m; Sample(int i,int j) m=i; n=j; void setvalue(int i) n=i; void display() coutm=mendl; coutn=nendl; private: int n; void main() const sample a(10,20); a.setvalue(40); a.m=30; a.disply(); 说明: 1.常对象要求不能直接或间接更改常对象的数据成

12、员。 2.常对象且只能调用常成员函数。,4.7.3 常对象成员,1. 常数据成员 使用const说明的数据成员。 说明:常数据成员只能通过构造函数的成员初始化列表对进行初始化,而任何其他函数都不能对该成员赋值。,例4.30 常数据成员举例。 #include class Date public: Date(int y,int m,int d); void showDate(); private: const int year ; const int month; const int day; ; Date:Date(int y,int m,int d) :year(y),month(m),da

13、y(d) inline void Date:showDate() coutyear.month.dayendl; void main() Date date1(1998,4,28); date1.showDate(); ,2.常成员函数 在类中使用关键字const说明的函数为常成员函数,常成员函数的说明格式如下: 类型说明符 函数名(参数表)const; const是函数类型的一个组成部分,因此在函数的实现部分也要带关键字const。,例4.31 常成员函数的使用。 #include class Date public: Date(int y,int m,int d); void showDate(); void showDate() const; private: int year; int month; int day; ; Date:Date(int y,int m,int d):year(y),month(m),day(d) void Date:showDate() coutShowDate1:endl; coutyear.month.dayendl; void Date:showDate() const coutShowDate2:endl; coutyear.month.dayendl;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论