!第2章 类和对象的特性_第1页
!第2章 类和对象的特性_第2页
!第2章 类和对象的特性_第3页
!第2章 类和对象的特性_第4页
!第2章 类和对象的特性_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、第第2 2章章 类和对象的特性类和对象的特性1第第2 2章章 类和对象的特性类和对象的特性2.1 2.1 面向对象程序设计方法概述面向对象程序设计方法概述2 2.2 .2 类的声明和对象的定义类的声明和对象的定义2 2.3 .3 类的成员函数类的成员函数2 2.4 .4 对象成员的引用对象成员的引用2 2. .5 5 类和对象的简单应用举例类和对象的简单应用举例2 2. .6 6 类的封装性和信息隐蔽类的封装性和信息隐蔽22 2.1 .1 面向对象程序设计方法概述面向对象程序设计方法概述vC+C+是是基于过程基于过程和和面向对象面向对象的混合型语言。的混合型语言。v基于过程基于过程的程序是由一

2、个个的程序是由一个个函数函数组成的,组成的,面向面向对象对象的程序是由一个个的程序是由一个个类类和和对象对象组成的。组成的。v面向对象程序设计的面向对象程序设计的主要特点主要特点:抽象抽象封装封装继承继承多态多态31. 1. 对象对象 客观世界中任何一个事物都可以看做一个对象客观世界中任何一个事物都可以看做一个对象班级班级对象对象 静态静态特征特征( () ):所属的系和专业、班级的人数,:所属的系和专业、班级的人数,所住的宿舍等;所住的宿舍等; 动态动态特特征征( () ):上课、开会、体育比赛等。:上课、开会、体育比赛等。人人对象对象 静态静态特征特征( () ):性别、年龄、身高、体重等

3、;:性别、年龄、身高、体重等; 动态动态特征特征( () ):起床、吃饭、运动、睡觉等。:起床、吃饭、运动、睡觉等。 4客观世界客观世界静态特征静态特征( () )动态特征动态特征( () )对象对象C+C+对象对象数据数据函数函数( (方法方法method)method)消息消息触发行为触发行为调用函数调用函数52. 2. 封装与信息隐蔽封装与信息隐蔽 封装封装将有关的将有关的数据数据和和操作代码(函数)操作代码(函数)封装封装在一个在一个对象中对象中,形成一个基本单位,各个对象之间相,形成一个基本单位,各个对象之间相对独立,互不干扰。对独立,互不干扰。 信息隐蔽信息隐蔽将对象中封装的将对象

4、中封装的部分信息对外隐蔽部分信息对外隐蔽,只留下少,只留下少量量接口接口( (函数函数) )与外界联系与外界联系,这种做法称为,这种做法称为信息信息隐蔽隐蔽( (imformation hiding)imformation hiding)。信息隐蔽信息隐蔽有利于数据安全有利于数据安全,防止无关的人了解,防止无关的人了解和修改数据。和修改数据。63. 3. 抽象抽象 当各对象有当各对象有相同的属性和行为相同的属性和行为时,可以将它们时,可以将它们抽象为一种类型抽象为一种类型,在,在C+C+中,这种类型就称为中,这种类型就称为“类类( (class)”class)”。例如:可将所有的人对象抽象为例

5、如:可将所有的人对象抽象为人类人类。例如:例如:C C和和C+C+中的中的数据类型数据类型就是对一批具体就是对一批具体 的的数数的抽象。的抽象。 类是对象的抽象,而对象则是类的特例。类是对象的抽象,而对象则是类的特例。74. 4. 继承与重用继承与重用 “马马”是是父类父类,或称为,或称为基类基类,“母马母马”是从是从“马马”派派生出来的,称为生出来的,称为子类子类或或派生类派生类。 采用采用继承继承的方法可以很方便地的方法可以很方便地利用一个已有的类建立利用一个已有的类建立一个新的类一个新的类。这就是常说的。这就是常说的“软件重用软件重用”(”(software software reusa

6、bility) reusability) 的思想。的思想。已建立了已建立了 马马 类类 马类马类 属性:属性:年龄年龄、身高身高、颜色颜色 行为:行为:吃草吃草、奔跑奔跑 ;现在要建立现在要建立 母马母马 类类 母马类母马类 行为:行为:下崽下崽 ;: : 继承继承马类马类85. 5. 多态性多态性 在在C+C+中,中,多态性多态性( (polymorphism)polymorphism)是指:是指: 由由继继承承而产生的而产生的不同的子类不同的子类,其对象其对象对对同一消息同一消息会会作出作出不同的响应不同的响应。文件文件( (父类父类) ).txt.txt文本文本文件文件( (子类子类)

7、).exe.exe可执行可执行文件文件( (子类子类) )双击双击( (消息消息) )启动文本编辑器启动文本编辑器并打开该文件并打开该文件行为行为执行此程序执行此程序96. 6. 面向对象程序设计的任务面向对象程序设计的任务 一、一、设计所需的各种类和对象设计所需的各种类和对象,即决定把哪些数,即决定把哪些数据和操作据和操作封装封装在一起;在一起; 二、考虑二、考虑怎样向有关对象发送消息(怎样向有关对象发送消息(调用对象的调用对象的函数函数),以完成所需的任务。,以完成所需的任务。102.2 2.2 类的声明和对象的定义类的声明和对象的定义 与与结构体类型结构体类型类似,在类似,在C+C+中也

8、是中也是先声明一个类先声明一个类类型,然后用它去类型,然后用它去定义定义若干个若干个类类类型的类型的对象对象。对对象象就是就是类类类型的一个类型的一个变量变量。 类的分类类的分类用户自己声明的类。用户自己声明的类。C+C+向用户提供的向用户提供的类库类库中的类:需卷入头文件中的类:需卷入头文件 类类是是抽象抽象的,的,不占用内存不占用内存,而,而对象对象是是具体具体的,的,占占用存储空间用存储空间。11一、声明类类型一、声明类类型class class 类名类名 privateprivate : : 成员数据成员数据; ; 成员函数;成员函数; public : public : 成员数据成员

9、数据; ; 成员函数;成员函数; protected: protected: 成员数据成员数据; ; 成员函数;成员函数; ; ;关键字关键字类名类名私有的私有的公有的公有的保护的保护的分号不能少分号不能少classclass Student Student /声明类类型声明类类型 privateprivate: : /声明以下部分为私有的声明以下部分为私有的 int num;int num; /学号学号 char name20; char name20; /姓名姓名 char sex; char sex; /性别性别 publicpublic: : /声明以下部分为公用的声明以下部分为公用的

10、 void display( ) void display( ) coutcout num:num: numendl;numendl; coutcout name:name: nameendl;nameendl; coutcout sex:sex: sexendl; sexendl; ; ;类类体体可全局声明或局部声明可全局声明或局部声明12说明:说明:1. 1. 访问限定符访问限定符 privateprivate(私有的)(私有的)成员成员:只能被只能被类内类内函数或函数或友元友元函数使用函数使用 publicpublic(公有的)成员:(公有的)成员:类内类内、类外类外均可使用均可使用 p

11、rotectedprotected(保护的)成员:(保护的)成员:能被能被类内类内、子类子类函数或函数或友元函数友元函数使用使用成员数据、成员函数成员数据、成员函数132. 2.一旦使用了访问限定符,一旦使用了访问限定符,该限定符一直有效,该限定符一直有效,直到直到出现出现另一个访问限定符另一个访问限定符或或类体结束类体结束为止。为止。3. 3.在声明类类型时,在声明类类型时,各访问限定部分无先后次序各访问限定部分无先后次序。现在现在的的C+C+程序程序多数先写多数先写publicpublic部分部分,后写后写privateprivate部分部分,可使用户将注意力集中在能被外,可使用户将注意力

12、集中在能被外界调用的成员上,使阅读者的思路更清晰一些。界调用的成员上,使阅读者的思路更清晰一些。4. 4.每一个每一个限定符在类体中可使用多次限定符在类体中可使用多次。但是为了。但是为了使程序清晰,使使程序清晰,使每一种成员访问限定符在类定每一种成员访问限定符在类定义体中只出现一次义体中只出现一次。5. 5.如果未加说明,类中成员如果未加说明,类中成员默认默认的访问权限是的访问权限是privateprivate,即私有的。,即私有的。146. 6.类只是声明了一种类型(模板),所以类只是声明了一种类型(模板),所以类中类中的任何成员数据均的任何成员数据均不能不能使用关键字使用关键字extern

13、extern,autoauto或或registerregister限定其存储类别限定其存储类别(static(static除外除外) )。7. 7.在声明类时,在声明类时,并不为类分配存储空间并不为类分配存储空间,所以,所以,在声明类中的数据成员时,在声明类中的数据成员时,不能对其初始不能对其初始化化。 class Test class Test int x int x=5=5, y, y=6=6; ; /不允许初始化不允许初始化 externextern float x; float x; /不允许限定存储类别不允许限定存储类别 ; ;15二、二、 定义对象的方法定义对象的方法1. 1. 先

14、声明类类型,先声明类类型,然后再定义对象然后再定义对象 class A class A ; ; A A a1, a2; a1, a2; void main(void) void main(void) A a3, a4; A a3, a4; 2. 2. 在声明类类型在声明类类型的同时定义对象的同时定义对象 class A class A a1,a2a1,a2; ;类名可以省略类名可以省略定义全局对象定义全局对象定义局部对象定义局部对象16三、类和结构体类型的异同三、类和结构体类型的异同 C+C+允许用允许用structstruct来声明一个类类型来声明一个类类型。 结构体结构体类型与类型与类类的

15、的唯一的区别唯一的区别在于:在于:在在类类中,其成员的中,其成员的缺省访问权限缺省访问权限是是私有私有的;的;在在结构体结构体类型中,其成员的类型中,其成员的缺省访问权限缺省访问权限是是公有公有的。的。 172.3 2.3 类的成员函数类的成员函数 类的类的成员函数成员函数( (简称简称类函数类函数) )的作用和用法的作用和用法和普和普通函数基本一样通函数基本一样,只是它属于一个类。,只是它属于一个类。 一般将需要被外界调用的成员函数指定为一般将需要被外界调用的成员函数指定为publicpublic,它们是类的它们是类的对外接口对外接口。 成员函数成员函数可在类体中定义可在类体中定义,也可,也

16、可在类体中在类体中只写只写成员函数的成员函数的声明声明,而,而在类外进行函数定义在类外进行函数定义。18class class A A float x, y; float x, y; /默认为默认为privateprivate publicpublic: : void Setxy(float a, float b)void Setxy(float a, float b) x=a; y=b; x=a; y=b; /在类体中定义成员函数在类体中定义成员函数 void Print( ) void Print( ) coutxtyendl; coutxtyendl; ; ;例:在类体中定义成员函数例:

17、在类体中定义成员函数19class Aclass A float x, y; float x, y; public: public: void Setxy(float a,float b)void Setxy(float a,float b); void Print( )void Print( );; ;void Setxy(float a,float b)void Setxy(float a,float b) x=a; y=b; x=a; y=b; void void Print( )Print( ) coutxtyendl; coutxtyendl; 在类体内在类体内声明声明成员函数成员函

18、数在类体外在类体外定义定义成员函数成员函数例:在类内声明、类外定义成员函数例:在类内声明、类外定义成员函数函数名之前要加函数名之前要加类名类名和和域运算符域运算符多于多于3 3行的函数,一般在类内声明,在类外定义。行的函数,一般在类内声明,在类外定义。A:A:A:A:20 inline inline 成员函数(内联成员函数)成员函数(内联成员函数) 在类中直接定义的成员函数在类中直接定义的成员函数在编译时作为在编译时作为内联内联函数函数来实现。来实现。 在在类内说明类内说明函数,函数,在类外定义时,在成员函数在类外定义时,在成员函数的的定义定义前面加上关键字前面加上关键字inlineinlin

19、e。21class Aclass A float x, y; float x, y; public: public: void Setxy(float a, float b)void Setxy(float a, float b) x=a; y=b; x=a; y=b; void Print( ) void Print( );; ;inline inline void void A:A:Print( )Print( ) coutxtyendl; coutxtyhourminutesec;cinhourminutesec; ; ;执行执行coutcoutsizeof(Time)sizeof(Ti

20、me)endl;endl; 输出的值是输出的值是_。1212242.4 2.4 对象成员的引用对象成员的引用 访问对象中的成员可以有访问对象中的成员可以有3 3种方法:种方法: 通过通过对象名对象名和和成员运算符成员运算符“.”“.”访问对象访问对象中的成员中的成员; ;通过指向对象的通过指向对象的指针指针访问对象中的成员访问对象中的成员; ;通过通过对象的引用变量对象的引用变量访问对象中的成员。访问对象中的成员。25一、通过对象名和成员运算符访问对象中的成员一、通过对象名和成员运算符访问对象中的成员 一般形式为:一般形式为:对象名对象名. .成员名成员名class class A A flo

21、atfloat x,y; x,y; /一般数据为私有的一般数据为私有的public: public: voidvoid Setxy( Setxy( floatfloat a, a, floatfloat b ) x=a; y=b; b ) x=a; y=b; floatfloat Getx( ) Getx( ) return return x; x; float float Gety( ) Gety( ) return return y; y; ; ;voidvoid main( ) main( ) A a1;A a1; /定义对象定义对象 float x1, y1; float x1, y1

22、; a1.x=2.5; a1.y=5.6; a1.x=2.5; a1.y=5.6; /为私有成员数据赋值为私有成员数据赋值 x1=a1.Getx(); y1=a1.Gety(); x1=a1.Getx(); y1=a1.Gety();/内联函数,作置换内联函数,作置换 coutx1ty1endl; coutx1ty1endl; a1a1y yx x2.52.55.65.6Setxy(2.5, 5.6);Setxy(2.5, 5.6);a1.Setxy(2.5 , 5.6); a1.Setxy(2.5 , 5.6); 必须通过类内必须通过类内公有函公有函数数访问私有成员数据访问私有成员数据非法,

23、私有成员不能非法,私有成员不能在类外直接访问在类外直接访问x1x1y1y12.52.55.65.6不能直接调用成员函数不能直接调用成员函数26说明说明:1. 1.同类型同类型的的对象之间可以整体赋值对象之间可以整体赋值,相当于相当于成员数据成员数据间相互赋值,与成员数据的访问权限无关。间相互赋值,与成员数据的访问权限无关。void main( )void main( ) A a1, a2; A a1, a2; a1.Setxy(2.0, 5.0); a1.Setxy(2.0, 5.0); /为为私有私有成员数据赋值成员数据赋值 a2=a1; a2=a1;/同类型同类型的对象之间可以赋值的对象之

24、间可以赋值 cout couta2.Getx()a2.Getx()tta2.Gety()a2.Gety()endl;endl; 2.02.05.05.0a2a2y yx xa1a1y yx x2.02.05.05.027a1a1y yx x2. 2. 可通过可通过指针变量指针变量访问私有成员数据。访问私有成员数据。class A class A float x,y; float x,y; public: public: void Setxy( float a, float b ) x=a; y=b; void Setxy( float a, float b ) x=a; y=b; void G

25、etxy(float void Getxy(float * *px,float px,float * *py );py ); ; ;void void A:A:Getxy(float Getxy(float * *px, float px, float * *py ) py ) * *px= x; px= x; * *py=y; py=y; void main( )void main( ) A a1; A a1; /定义对象定义对象 float x1, y1; float x1, y1; a1.Setxy(2.0 , 5.0); a1.Setxy(2.0 , 5.0); a1.Getxy( a

26、1.Getxy(&x1&x1, , &y1&y1); ); coutx1ty1endl; coutx1ty1endl; y1y1x1x1&x1&x1pxpx&y1&y1pypy2.02.05.05.02.02.05.05.028 3. 3.还可通过还可通过引用引用来访问私有成员数据。来访问私有成员数据。a1a1y yx xclass A class A float x,y; float x,y; public: public: void Setxy( float a, float b ) x=a; y=b; void Setxy(

27、 float a, float b ) x=a; y=b; void Getxy(float void Getxy(float & &px,float px,float & &py );py ); ; ;void Getxy(float void Getxy(float & &px,float px,float & &py ) px= x; py=y; py ) px= x; py=y; void main( )void main( ) A a1; A a1; /定义对象定义对象 float x1, y1; float x1, y

28、1; a1.Setxy(2.0 , 5.0); a1.Setxy(2.0 , 5.0); a1.Getxy( a1.Getxy(x1x1, , y1y1); ); coutx1ty1endl; coutx1ty1endl; y1y1x1x1pxpxpypy2.02.05.05.02.02.05.05.029编程编程: :1. 1.编写三角形的类编写三角形的类TriangleTriangle:1) 1)成员数据:成员数据: 三角形的边长三角形的边长a,b,ca,b,c;2) 2)成员函数:成员函数:SetSet:从键盘输入从键盘输入三条边的值三条边的值GetGet:取出三边长的值:取出三边长的值

29、PerimPerim:计算三角形的周长:计算三角形的周长AreaArea:计算三角形的面积:计算三角形的面积 p= p=周长周长/2/2; area=sqrt(p area=sqrt(p* *(p-a)(p-a)* *(p-b)(p-b)* *(p-c);(p-c);2. 2.编写主程序编写主程序mainmain1) 1)定义类的对象定义类的对象triltril;2) 2)从键盘输入三条边的从键盘输入三条边的值值; ;3) 3)取出三条边的值给取出三条边的值给x,y,z,x,y,z,并输出三边值;并输出三边值;4) 4)计算三角形的面积,计算三角形的面积,并输出。并输出。30#include

30、#includeclass Triangle /private: float a,b,c;/三边长三边长public: void Set() cinabc; void Get(float &x,float &y,float &z)x=a;y=b;z=c; float Perim()return (a+b+c); float Area()float p=Perim()/2;return(sqrt(p*(p-a)*(p-b)*(p-c);void main() Triangle tril;float x,y,z;tril.Set();tril.Get(x,y,z);cout

31、三角形的三边长为:三角形的三边长为:x,y,zendl;cout三角形面积为:三角形面积为:tril.Area() p-Setxy(2.0 , 5.0); Setxy(2.0 , 5.0); p-p-Getxy(Getxy(x1x1, , y1y1); ); coutx1ty1endl; coutx1ty1endl; /( (* *p)p).Getxy(x1, y1);.Getxy(x1, y1);/ / ( (* *p)p).Setxy(2.0, 5.0);.Setxy(2.0, 5.0);32三、通过对象的三、通过对象的引用变量引用变量来访问对象中的成员来访问对象中的成员class A c

32、lass A float x,y; float x,y; public: public: void Setxy( float a, float b ) x=a; y=b; void Setxy( float a, float b ) x=a; y=b; void Getxy(float void Getxy(float & &px,float px,float & &py ) px= x; py=y; py ) px= x; py=y; ; ;void main( )void main( ) A a1, A a1,&a2=a1&a2=a1; ;

33、/a2/a2是是a1a1的别名,与的别名,与a1a1共享内存共享内存 float x1, y1; float x1, y1; a2. a2.Setxy(2.0 , 5.0); Setxy(2.0 , 5.0); a2.a2.Getxy(Getxy(x1x1, , y1y1); ); coutx1ty1endl; coutx1ty1endl; a1a1y yx x2.02.05.05.0a2a233类的嵌套(自学)类的嵌套(自学)class A class A class Bclass B int i, j; int i, j; public : public : void Setij(int

34、m, int n) i=m; j=n; void Setij(int m, int n) i=m; j=n; ; ; float x,y; float x,y;public: public: B b1,b2;B b1,b2; void Setxy( float a, float b ) x=a; y=b; void Setxy( float a, float b ) x=a; y=b; void Print(void) coutxtyendl; void Print(void) coutxtyendl; ; ;类类B B包含在类包含在类A A中中,为嵌套声明,为嵌套声明嵌套类的对象嵌套类的对象

35、1. 1.嵌套类的作用域在类嵌套类的作用域在类A A的定的定义结束时结束义结束时结束。2. 2.在类在类A A的定义中,并不为的定义中,并不为b1, b2b1, b2分配空间,分配空间,只有在定义只有在定义类类A A的对象时,才为嵌套类的对象时,才为嵌套类的对象分配空间的对象分配空间。34例例2.4 2.4 找出一个整型数组中的元素的最大值。找出一个整型数组中的元素的最大值。/arraymax.harraymax.hclassclass Array_max Array_max /声明类声明类 publicpublic: : /以下以下3 3行为成员函数原型声明行为成员函数原型声明 void s

36、et_value( ); void set_value( ); /对数组元素设置值对数组元素设置值 void max_value( ); void max_value( ); /找出数组中的最大元素找出数组中的最大元素 void show_value( ); void show_value( ); /输出最大值输出最大值privateprivate: : int array10; int array10; /整型数组整型数组 int max; int max; /max/max用来存放最大值用来存放最大值; ;2.5 2.5 类和对象的简单应用举例类和对象的简单应用举例/arraymax.cp

37、parraymax.cpp#include #include #include #include arraymax.harraymax.h void Array_max:void Array_max:show_valueshow_value( )( )/输出最大值输出最大值 coutmax=max; coutmax=max; 35void Array_maxvoid Array_max: :max_valuemax_value( )( )/找数组元素中的最大值找数组元素中的最大值 int i;int i; max=array0;max=array0; for (i=1;i10;i+)for (i=1;imaxarrayimax) ) max=arrayi;max=arrayi; /f1.cppf1.cpp

温馨提示

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

评论

0/150

提交评论