面向对象程序设计 ch4.ppt
《面向对象程序设计 ch4.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计 ch4.ppt(125页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章建立类和对象的概念建立类和对象的概念本章将重点介绍在本章将重点介绍在C+中定义类、建立和使用中定义类、建立和使用对象的基本方法。虽然同类的对象在其数据成对象的基本方法。虽然同类的对象在其数据成员的取值方面是不相同的,但却可以共用相同员的取值方面是不相同的,但却可以共用相同的代码。的代码。类是对同类对象的描述,它不但描述了对象之类是对同类对象的描述,它不但描述了对象之间的公有接口,同时也给出了对象的内部实现间的公有接口,同时也给出了对象的内部实现(数据成员和成员函数)。(数据成员和成员函数)。为了学以致用,本章还简要介绍面向对象编程为了学以致用,本章还简要介绍面向对象编程的文件规范。的
2、文件规范。主要内容主要内容4.1 类及其实例化类及其实例化4.2 构造函数构造函数4.3 析构函数析构函数4.4 调用复制构造函数的综合实例调用复制构造函数的综合实例4.5 成员函数重载及默认参数成员函数重载及默认参数4.6 this指针指针4.7 一个类的对象作为另一个类的成员一个类的对象作为另一个类的成员4.8 类和对象的性质类和对象的性质4.9 面向对象的标记图面向对象的标记图4.10 面向对象编程的文件规范面向对象编程的文件规范4.1.1定义类定义类像构造枚举和结构一样,类也是一种用户自己构造的数据像构造枚举和结构一样,类也是一种用户自己构造的数据类型并遵循类型并遵循C+的规定。例如,
3、类也要先声明后使用;不的规定。例如,类也要先声明后使用;不管声明的内容是否相同,声明同一个名字的两个类是错误管声明的内容是否相同,声明同一个名字的两个类是错误的,类是具有惟一标识符的实体;在类中声明的任何成员的,类是具有惟一标识符的实体;在类中声明的任何成员不能使用不能使用extern、auto和和register关键字进行修饰;类中关键字进行修饰;类中声明的变量属于该类,在某些情况下,变量可以被该类的声明的变量属于该类,在某些情况下,变量可以被该类的不同实例所共享。不同实例所共享。类和其他数据类型不同的是,组成这种类型的不仅可以有类和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可
4、以有对数据进行操作的函数,它们分别叫做数据,而且可以有对数据进行操作的函数,它们分别叫做类的数据成员和类的成员函数,而且不能在类声明中对数类的数据成员和类的成员函数,而且不能在类声明中对数据成员使用表达式进行初始化。据成员使用表达式进行初始化。1.声明类声明类类是对一组性质相同对象的程序描述。在类是对一组性质相同对象的程序描述。在C+中声明类的中声明类的一般形式为:一般形式为:class类名类名private:私有数据和函数私有数据和函数public:公有数据和函数公有数据和函数protected:保护数据和函数保护数据和函数;类声明以关键字类声明以关键字class开始,其后跟类名。类所声明的
5、内开始,其后跟类名。类所声明的内容用花括号括起来,右花括号后的分号作为类声明语句的容用花括号括起来,右花括号后的分号作为类声明语句的结束标志。这一对花括号结束标志。这一对花括号“”之间的内容称为类体。之间的内容称为类体。类中定义的数据和函数称为这个类的成员(数据成员和成类中定义的数据和函数称为这个类的成员(数据成员和成员函数)。类成员均具有一个属性,叫做访问权限,通过员函数)。类成员均具有一个属性,叫做访问权限,通过它前面的关键字来定义。顾名思义,关键字它前面的关键字来定义。顾名思义,关键字private、public和和protected以后的成员的访问权限分别是私有、以后的成员的访问权限分
6、别是私有、公有和保护的,把这些成员分别叫做私有成员、公有成员公有和保护的,把这些成员分别叫做私有成员、公有成员和保护成员。访问权限用于控制对象的某个成员在程序中和保护成员。访问权限用于控制对象的某个成员在程序中的可访问性,如果没有使用关键字,则所有成员默认声明的可访问性,如果没有使用关键字,则所有成员默认声明为为private权限。这些关键字的使用顺序和次数也都是任权限。这些关键字的使用顺序和次数也都是任意的。意的。【例【例4.1】描述点的描述点的Point类。类。classPoint/类名类名Pointprivate:/声明为私有访问权限声明为私有访问权限intx,y;/私有数据成员私有数据
7、成员public:/声明为公有访问权限声明为公有访问权限voidSetxy(inta,intb);/无返回值的公有成员函数无返回值的公有成员函数voidMove(inta,intb);/无返回值的无返回值的/公有成员函数公有成员函数voidDisplay();/无返回值的公有成员函数无返回值的公有成员函数intGetx();/返回值为返回值为int的公有成员函数的公有成员函数intGety();/返回值为返回值为int的公有成员函数的公有成员函数;/类声明以分号结束类声明以分号结束x和和y是私有成员是私有成员Setxy、Display、Move、Getx和和Gety是公有成员是公有成员因为只是
8、声明函数,所以可只给出函数原型。因为只是声明函数,所以可只给出函数原型。【例例4.2】是其等效的声明方式。是其等效的声明方式。【例【例4.2】使用默认关键字及改变关键字顺序和次数的使用默认关键字及改变关键字顺序和次数的Point类。类。#includeusingnamespacestd;classPoint/类名类名Pointintx;/默认私有数据成员默认私有数据成员public:/声明为公有访问权限声明为公有访问权限voidSetxy(int,int);/无返回值的公有成员无返回值的公有成员/函数的函数原型函数的函数原型voidMove(int,int);/无返回值的公有成员无返回值的公有
9、成员/函数的函数原型函数的函数原型voidDisplay();/无返回值的公有成员无返回值的公有成员/函数的函数原型函数的函数原型intGetx();/返回值为返回值为int的公有成员的公有成员/函数的函数原型函数的函数原型intGety();/返回值为返回值为int的公有成员的公有成员/函数的函数原型函数的函数原型private:/声明为私有访问权限声明为私有访问权限inty;/私有数据成员私有数据成员;/类定义以分号结束类定义以分号结束由此可见,成员函数声明的规则与第由此可见,成员函数声明的规则与第3章所述的函数声明章所述的函数声明规则相同。规则相同。2.定义成员函数定义成员函数类中说明的
10、成员函数用来对数据成员进行操作。例如,类中说明的成员函数用来对数据成员进行操作。例如,Point类的类的Setxy函数用来为该类的对象设置初始值,而当函数用来为该类的对象设置初始值,而当调用成员函数调用成员函数Getx时,则返回一个对象的数据成员时,则返回一个对象的数据成员x的值。的值。在类中只对这些成员函数进行了函数声明,还必须在程序在类中只对这些成员函数进行了函数声明,还必须在程序中实现这些成员函数。中实现这些成员函数。定义成员函数的一般形式为:定义成员函数的一般形式为:返回类型返回类型类名类名:成员函数名(参数列表)成员函数名(参数列表)成员函数的函数体成员函数的函数体/内部实现内部实现
11、其中其中“:”是作用域运算符,是作用域运算符,“类名类名”是成员函数所属类是成员函数所属类的名字,的名字,“:”用于表明其后的成员函数是属于这个特定用于表明其后的成员函数是属于这个特定的类。的类。换言之,换言之,“类名类名:成员函数名成员函数名”的意思就是对属于的意思就是对属于“类名类名”的成员函数进行定义,而的成员函数进行定义,而“返回类型返回类型”则是这个成员函则是这个成员函数返回值的类型。数返回值的类型。余下的工作就是定义成员函数的函数体。例如余下的工作就是定义成员函数的函数体。例如Setxy是类是类Point的成员函数,它没有返回值,则定义如下:的成员函数,它没有返回值,则定义如下:v
12、oidPoint:Setxy(inta,intb)x=a;y=b;将将“voidPoint:Setxy(inta,intb)”理解为定义理解为定义Point的的函数成员函数成员Setxy(inta,intb),该成员带有两个整型参数,该成员带有两个整型参数,函数没有返回值函数没有返回值(void)。按此方法,可写出其他几个成员按此方法,可写出其他几个成员函数的定义:函数的定义:voidPoint:Move(inta,intb)x=x+a;y=y+b;voidPoint:Display()coutx,yendl;intPoint:Getx()returnx;intPoint:Gety()retu
13、rny;也可以使用关键字也可以使用关键字inline将成员函数定义为内联函数,将成员函数定义为内联函数,例如:例如:inlineintPoint:Getx()returnx;如果在声明类的同时,在类体内给出成员函数的定义,如果在声明类的同时,在类体内给出成员函数的定义,则默认为内联函数。例如在类中将声明则默认为内联函数。例如在类中将声明Getx的语句的语句“intGetx();”改为改为“intGetx()returnx;”,则则Getx为内联函数。一般直接在类体内给出简单成员函数的定为内联函数。一般直接在类体内给出简单成员函数的定义。有些成员函数的实现方式不止一种,例如义。有些成员函数的实现
14、方式不止一种,例如voidPoint:Display()coutGetx(),Gety()endl;是调用成员函数是调用成员函数Getx()和和Gety()实现的,它们使用了实现的,它们使用了cout流,应在定义之前包含如下语句:流,应在定义之前包含如下语句:#includeusingnamespacestd;3.数据成员的赋值数据成员的赋值不能在类体内给数据成员赋值不能在类体内给数据成员赋值,即下面的方法是错误的:即下面的方法是错误的:ClassPointintx=25,y=56;当然,在类体外面就更不允许了。当然,在类体外面就更不允许了。数据成员的具体值是用来描述对象的属性的。只有产生数据
15、成员的具体值是用来描述对象的属性的。只有产生了一个具体的对象,这些数据值才有意义,所以又称对了一个具体的对象,这些数据值才有意义,所以又称对象的初值或对象初始化象的初值或对象初始化。这跟简单数据类型的道理一样,这跟简单数据类型的道理一样,int是整数类型,但需要是整数类型,但需要声明整数对象之后才有意义,声明整数对象之后才有意义,“intx=5;”使得整数对象使得整数对象x的值为的值为5。只是类具有成员函数而已。假设已经有了一。只是类具有成员函数而已。假设已经有了一个对象个对象A,则可使用则可使用“.”运算符调用成员函数运算符调用成员函数Setxy赋赋初值。例如:初值。例如:A.Setxy(2
16、5,56);将对象将对象A的数据成员的数据成员x和和y分别赋给分别赋给25和和56,即,即A.x=25,A.y=56。其实,真正的初始化是使用与其实,真正的初始化是使用与Point同名的构同名的构造函数造函数Point(int,int)实现的。在实现的。在2.1.1节介绍使用节介绍使用string的对象的对象str时,使用时,使用“stringstr2(等于等于);”语句。语句。按此推理,可以写出产生按此推理,可以写出产生Point对象的语句:对象的语句:PointA(25,56);这就是使用构造函数产生类的实例。不过,现在还没有定这就是使用构造函数产生类的实例。不过,现在还没有定义构造函数义
17、构造函数Point(int,int),所以还不能使用这种方法。但所以还不能使用这种方法。但可以看到数据封装的迹象了!可以看到数据封装的迹象了!4.1.2使用类的对象及指针使用类的对象及指针Point类是用户定义的一种类型,类是用户定义的一种类型,Point类所说明的数据成类所说明的数据成员描述了对象的内部数据结构,对数据成员的访问通过类员描述了对象的内部数据结构,对数据成员的访问通过类的成员函数来进行。使用的成员函数来进行。使用Point在程序中声明变量,具有在程序中声明变量,具有Point类的类型的变量被称为类的类型的变量被称为Point的对象的对象。只有产生类的只有产生类的对象,才能使用这
18、些数据和成员函数。类对象,才能使用这些数据和成员函数。类Point不仅可以不仅可以声明对象,还可以声明对象的引用和对象的指针,语法与声明对象,还可以声明对象的引用和对象的指针,语法与基本数据类型一样。基本数据类型一样。PointA,B;/定义定义Point类型的对象类型的对象A和和BPoint*p=&A;/定义指向对象定义指向对象A的的Point类型的指针类型的指针Point&R=B;/定义定义R为为Point类型对象类型对象B的引用的引用对象和引用都使用运算符对象和引用都使用运算符“.”访问对象的成员,指针则访问对象的成员,指针则使用使用“-”运算符。例如:运算符。例如:A.Setxy(25
19、,88);/为对象为对象A设置初值设置初值p-Display();/显示指针显示指针p所指对象所指对象A的数据成员的数据成员A.x和和A.y之值之值R.Display();/显示对象显示对象B的数据成员的数据成员B.x和和B.y之值之值【例【例4.3】根据上面对根据上面对Point类的定义,演示使用类的定义,演示使用Point类类的对象。的对象。voidprint(Pointa)/使用使用Point的对象的对象a作为函数参数作为函数参数a.Display();/显示对象显示对象a的数据成员的值的数据成员的值voidmain()PointA,B;/声明对象声明对象A.Setxy(25,55);/
20、为对象为对象A赋初值赋初值B=A;/B的数据成员取的数据成员取A的数据成员之值的数据成员之值A.Display();/显示显示A的数据成员的数据成员A.Move(-10,20);/移动移动Aprint(A);/等价于等价于A.Display();print(B);/等价于等价于B.Display()coutA.Getx()endl;/只能使用只能使用A.Getx(),/不能使用不能使用A.x本例中的本例中的print函数使用函数使用Point的对象作为参数。的对象作为参数。C+推荐推荐使用下面的引用的形式:使用下面的引用的形式:voidprint(Point&a)/使用对象的引用做为函数参数使
21、用对象的引用做为函数参数a.Display();/显示引用对象显示引用对象a的数据成员之值的数据成员之值对象对象A移动之后,对象移动之后,对象B仍为原来的值,所以输出如下:仍为原来的值,所以输出如下:25,55/原来的原来的A和和B15,75/新的新的A25,55/原来的原来的B15/A.Getx()返回对象返回对象A的数据成员的数据成员x的之值的之值如果在如果在print函数或主函数里使用如下语句,则产生错误:函数或主函数里使用如下语句,则产生错误:coutA.x,A.y”运算符访问对象的成员,即:运算符访问对象的成员,即:对象指针名对象指针名-对象成员名对象成员名【例【例4.4】演示使用内
22、联函数定义演示使用内联函数定义Point类及使用类及使用Point类类指针和引用的完整例子。指针和引用的完整例子。#include/包含头文件包含头文件usingnamespacestd;/声明命名空间声明命名空间classPoint/使用内联函数定义类使用内联函数定义类Pointprivate:/声明为私有访问权限声明为私有访问权限intx,y;/私有数据成员私有数据成员public:/声明为公有访问权限声明为公有访问权限voidSetxy(inta,intb)/无返回值的内联无返回值的内联/公有成员函数公有成员函数x=a;y=b;voidMove(inta,intb)/无返回值的内联无返回
23、值的内联/公有成员函数公有成员函数x=x+a;y=y+b;voidDisplay()/无返回值的内联无返回值的内联/公有成员函数公有成员函数coutx,yDisplay();voidprint(Point&a)/类引用作为类引用作为print函数函数/的参数定义重载函数的参数定义重载函数a.Display();voidmain()/主函数主函数PointA,B,*p;/声明对象和指针声明对象和指针Point&RA=A;/声明对象声明对象RA引用对象引用对象AA.Setxy(25,55);/使用成员函数为对象使用成员函数为对象A赋值赋值B=A;/使用赋值运算符为对象使用赋值运算符为对象B赋赋值值
24、p=&B;/类类Point的指针指向对象的指针指向对象Bp-Setxy(112,115);/使用指针调用函数使用指针调用函数Setxy/重新设置重新设置B的值的值print(p);/传递指针显示对象传递指针显示对象B的属性的属性p-Display();/再次显示对象再次显示对象B的属性的属性RA.Move(-80,23);/引用对象引用对象RA调用调用Move函数函数print(A);/验证验证RA和和A同步变化同步变化print(&A);/直接传递直接传递A的地址作为指针参数的地址作为指针参数程序运行结果如下:程序运行结果如下:112,115112,115-55,78-55,78由此可见,使
25、用对象和对象指针的效果一样。由此可见,使用对象和对象指针的效果一样。4.1.4数据封装数据封装面向对象的程序设计,是通过为数据和代码建立分块的内面向对象的程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法,存区域,以便提供对程序进行模块化的一种程序设计方法,这些模块可以被用做样板,在需要时再建立其副本。根据这些模块可以被用做样板,在需要时再建立其副本。根据这个定义,对象是计算机内存中的一块区域,通过将内存这个定义,对象是计算机内存中的一块区域,通过将内存分块,每个模块分块,每个模块(即对象即对象)在功能上保持相对独立。另外,在功能上保持相对独立。另外,定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计 ch4 面向 对象 程序设计
限制150内