面向对象程序设计之类和对象_第1页
面向对象程序设计之类和对象_第2页
面向对象程序设计之类和对象_第3页
面向对象程序设计之类和对象_第4页
面向对象程序设计之类和对象_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

关于面向对象程序设计之类和对象第一页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是面向对象的程序设计? 面向对象的程序设计(Object-OrientedProgramming)和传统的结构化程序设计的思路完全不同。面向对象的程序设计和人们日常生活解决问题的思路是相似的。比如,我们生产汽车时,不是顺序制造发动机,在设计制造底盘、车身、轮子。而是分别设计制造发动机、底盘、车身和轮子,最后组装在一起。组装时,各部件之间有联系,以便协调工作。例如,司机踩油门,就能调节油路,控制发动机的转速,就能驱动车轮。

第二页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述 程序设计者的任务有两个:一是设计所需要的类和对象,即确定那些数据和操作封装在一起;(类设计者、核心模块产品提供商)二是考虑怎样向有关对象发送消息,以启动相关对象的操作。(主程序设计者,外包程序,面向用户的公司) 编程者如同一个总调度,不断地向各个对象发出命令,让这些对象活动起来,完成指定的工作。 这就是面向对象的程序设计的基本思路。第三页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是对象(object)? 一个对象由一组“属性”和一组“行为”构成。并根据外界给它的消息进行相应的操作。系统中多个对象通过一定的渠道相互联系。 任何事物都可以看成一个对象。可以是自然物体,也可以是逻辑结构。例:

一个班级作为对象一个班级作为对象,有两个要素:一是班级的静态特征,如班级所属的专业,学生人数、班主任姓名等,这种静态特征称为“属性”;另一个是班级的动态特征,如上课,体育比赛,开会等,称为“行为”。外界向班级发一个信息(如上课铃声,广播通知),我们称之为“消息”,班级就会发生一个操作(要么上课,要么开会)第四页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是C++对象?

C++中,每个对象都由若干数据(属性)和若干函数(操作行为)组成。数据就是对象的“属性”,函数就是用来对数据进行的“操作”,以便实现某种功能。这种操作就是对象的“行为”,也叫“方法”。 我们点击一下鼠标,按动键盘的一个按钮,就是给某个对象一个消息,系统回调用该对象中的函数进行操作。 比如长方形对象,其长和宽就是它的属性,调用该对象的一些函数,即向该对象传送一些消息,可以用来对其长、宽值进行加工计算,以实现求出面积、周长等功能。

第五页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是对象封装(encapsulation

)? 就是把对象的不想让外界知道的属性和功能屏蔽起来,让外界看不见。封装有两个含义,一是将有关的数据和操作函数封装成一个基本单位,即对象内。各对象之间相互独立,互不干扰;二是将对象中的部分属性或功能对外隐蔽,只留少数接口向外公布,以接收外界信息。对象封装的好处在于,降低了人们操作对象的复杂程度。使用对象的人,不必知道对象内部的实现细节,只需要了解外部功能就可以自如地操作该对象。 对象的行为由类的内部数据结构和相关的操作确定;外部行为通过操作接口实现。人们关心的就是操作接口(函数名)所能提供的服务。

第六页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是抽象(abstraction)? 将具有相同特性的事物归纳、集中成一个统一类型,称为抽象。比如,把张三,李四,王五归纳为一类,我们称之为“人”。

抽象的作用,是表示同类事物的本质。 C和C++中,数据类型就是对一批具体数据的抽象,整形数据就是所有整数的抽象。

“类”是“对象”的抽象,“对象”则是类的“特例”,或“具体表现形式”。第七页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是继承(inherit)?

B类在A类的基础上增加了少量内容。我们显然不必重新设计一个新类B,只需要把A类拿过来,在此基础上添加新内容就可以了。这就是面向对象程序设计的继承机制。

C++提供继承机制,大大节省了编程工作量,这就是所谓“软件重用(softwarereusability)”的思想。对于大型软件的开发具有重要意义。第八页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述什么是多态性(polymorphism)? 如果有几个相似而不同的对象,人们往往要求在向它们发出同一个消息时,各自作出不同的操作,这种情况就是“多态现象”。 C++中,所谓多态性是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。 显然,多态性能增加程序的灵活性,它是面向对象程序设计的重要特征。第九页,共五十六页,编辑于2023年,星期四2.1面向对象程序设计方法概述类与对象的作用

C++全面支持传统的面向过程的程序设计(即结构化编程),也支持基于对象和面向对象的程序设计。 所谓基于对象,是指程序是以类和对象为基础,程序的操作是围绕对象进行的。 所谓面向对象,是指,在基于对象的基础上,利用了继承机制和多态性。面向对象的程序设计特点: 类具有对数据的抽象性、封装性、继承性、多态性。第十页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义类和对象的关系

C++中,对象的类型称为类(class)。类代表了某一批对象的共同特性。前面已经谈到,类是对象的抽象,而对象是类的具体实例(instance)。就象结构体类型和结构体变量一样。

C++中,我们先声明一个类的类型,然后再定义该类的若干对象。对象就是类这种类型的一个变量。

类是抽象的,不占内存,而对象是具体的,要占用内存空间。第十一页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义类的声明 类的声明方法和结构体的声明方法一样,只是将关键字struct换成class:class类名{private:

私有数据成员和私有成员函数;

public:

公共数据成员和公共成员函数;};//成员访问限定区域先后次序任意,但一种最好只出现一次,类的成员包含对数据操作的函数,体现了数据和操作的封装类的成员不能所有都私有,一般隐藏数据,把成员函数作为对外接口成员访问限定符(memberaccessspecifier)成员访问限定符(memberaccessspecifier)别忘了必须用分号结束!第十二页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义类的声明示例类头:classrectangle类体:{private: intlength,width,area,perimeter;public:

voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“length=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}};在类的外面不能访问私有成员,只能通过公有成员函数间接访问在类的外面可以访问公有成员不指定公有私有,则默认为私有一般先出现private,后出现public第十三页,共五十六页,编辑于2023年,星期四类的声明还有一种protected类型,不能被类外访问,但可以被派生类访问一般使用厂商提供的类库也可以自定义类库,便于单位部门使用第十四页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义对象的定义 声明了类以后,就可以定义该类的对象了。给对象分配了存储空间。其格式为:

[class]类名对象名1,对象名2,…//方括号表示可选项对象定义示例 如前例中,声明了一个名为rectangle的类,我们可以定义该类的若干对象:

classrectangler1,r2,r3; rectangler1,r2,r3;第十五页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义对象定义classrectangle{private: intlength,width,area,perimeter;public: voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“length=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}}r1,r2;不出现类名,直接定义对象,不提倡第十六页,共五十六页,编辑于2023年,星期四2.2类的声明和对象的定义类和结构体类型异同struct/classrectangle{ public/private:intlength,width,area,perimeter; voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“length=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}}r1,r2;建议使用CLASS第十七页,共五十六页,编辑于2023年,星期四2.3类的成员函数成员函数的性质类的成员函数也叫类函数,用法和一般函数基本上一样。区别在于它只是属于一个类的成员而出现在类中。它可以被指定为类的私有成员(private)、公有成员(public)或保护成员(protected)。 使用类函数时,要注意它的使用权限,如果是私有成员,只能被本类的其他成员函数调用,不能被类外调用(工具函数)。成员函数可以调用本类所有数据成员和成员函数,也可以引用在本作用域中的有效数据。 通常,我们把类的数据成员定义成私有成员,对外屏蔽,而把成员函数定义成公有成员,他可以调用私有成员和其它成员。 一个类若没有成员函数,就退化成C语言的结构体,而失去意义。 第十八页,共五十六页,编辑于2023年,星期四2.3类的成员函数在类外定义成员函数 成员函数一般在类体中定义,如前面所讲。也可以在类外定义,但要指明是属于哪个类的成员函数,用“类名::函数名”来指定。例如:classrectangle{private:intlength,width,;intarea,perimeter;public:voidPutArea();voidPutPerimeter();voiddisplay();};voidrectangle::PutArea(){area=length*width;}voidrectangle::PutPerimeter(){perimeter=(length+width)*2;}voidrectangle::display(){cout<<“length=“<<length<<endl;cout<<“width=“<<width<<endl;cout<<“area=“<<area<<endl;cout<<“perimeter=“<<perimeter;}rectangler1,r2,r3;第十九页,共五十六页,编辑于2023年,星期四“::”成为域限定符。如果在域限定符前没有类名,或函数名前既没有类名,又没有域限定符:

::display()或display()

则表示该函数不属于任何类,它不是成员函数,而是全局函数,即普通函数。第二十页,共五十六页,编辑于2023年,星期四一般来说,类定义包括两个部分:1、声明部分(“做什么”):数据成员(名称、类型)

成员函数(方法)2、实现部分(“怎么做”):成员函数的定义和实现声明在定义之前,也即是类体外定义成员函数(这里用定义,实际是给函数分配了空间,后章节详述)减小了类体长度,隐藏了执行细节,提高了类的保密性第二十一页,共五十六页,编辑于2023年,星期四2.3类的成员函数

inline成员函数 类的成员函数也可以指定为内联函数,只要是函数代码较少,有频繁使用。我们只要在成员函数的类型签名加上inline关键字就可以。classrectangle{private:intlength,width,;intarea,perimeter;public:inlinevoidPutArea();

inlinevoidPutPerimeter();

voiddisplay() {cout<<“length=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;};第二十二页,共五十六页,编辑于2023年,星期四2.3类的成员函数

inline成员函数

classrectangle{private:intlength,width,;intarea,perimeter;public:inlinevoidPutArea();

inlinevoidPutPerimeter();voiddisplay();};voidrectangle::display(){cout<<“length=“<<length<<endl;cout<<“width=“<<width<<endl;cout<<“area=“<<area<<endl;cout<<“perimeter=“<<perimeter;}Inline第二十三页,共五十六页,编辑于2023年,星期四2.3类的成员函数

inline成员函数类体中不包含循环控制结构,此类成员函数自动作为inline成员函数。类体外也可定义inline成员函数,声明、定义其一显式定义即可,类定义和其成员函数定义必须在同一文件(或包含)。

第二十四页,共五十六页,编辑于2023年,星期四2.3类的成员函数成员函数的存储方式

同一类定义了多个对象时,每个对象的数据成员各自占据独立的空间,而共享一个共用的函数代码段,不占用对象的存储空间。

C++为此专门设立了一个名为this的指针,用来指向不同的对象。当调用对象r1,成员函数访问的就是r1的数据成员。所以成员函数建议在类体外定义。数据1对象r1数据2对象r2数据10对象r10…共用函数代码第二十五页,共五十六页,编辑于2023年,星期四2.4对象成员的引用用对象名和成员运算符(.)访问对象成员举例:

classrectangle{public:

intlength,width;//公共数据成员voiddisplay();//公共成员函数};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler1;

r1.lenght=5;//用对象名和成员运算符)访问数据成员

r1.width=4;//用对象名和成员运算符(.)访问数据成员

r1.display();//用对象名和成员运算符(.)访问成员函数}用这种方式访问的成员,必须定义成公用成员!第二十六页,共五十六页,编辑于2023年,星期四2.4对象成员的引用用指向对象的指针访问对象成员举例:(*p).length被简化成p->length

classrectangle{public:intlength,width;//公共数据成员voiddisplay();//公共成员函数};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler2,*p;p=&r2;

p->lenght=5;

p->width=4;

p->display();}用这种方式万分的成员,也必须定义成公用成员!第二十七页,共五十六页,编辑于2023年,星期四2.4对象成员的引用用对象的引用访问对象成员举例:

classrectangle{public:intlength,width;//公共数据成员voiddisplay();//公共成员函数};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler2;rectangle&r3=r2;

r3.lenght=5;

r3.width=4;

r3.display();}第二十八页,共五十六页,编辑于2023年,星期四例定义一个时间类,并定义一个对象及其引用,输入时分秒输出时:分:秒#include<iostream>usingnamespacestd;intmain(){Timet1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第二十九页,共五十六页,编辑于2023年,星期四例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;

Time&t2=t1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第三十页,共五十六页,编辑于2023年,星期四例定义2个对象,分别输入时分秒输出时:分:秒#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){return0;}第三十一页,共五十六页,编辑于2023年,星期四例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;Timet2;cin>>t2.hour;cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl;return0;}第三十二页,共五十六页,编辑于2023年,星期四例:定义函数执行输入输出#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};

intmain(){

voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}

第三十三页,共五十六页,编辑于2023年,星期四例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}

voidset_time(Time&t){cin>>t.hour;cin>>t.minute;cin>>t.sec;}

voidshow_time(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}第三十四页,共五十六页,编辑于2023年,星期四例:定义含默认值参数的set_time和show_time函数#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){Timet1;set_time(t1,12,23,34);show_time(t1);Timet2;set_time(t2);show_time(t2);}

第三十五页,共五十六页,编辑于2023年,星期四例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){

voidset_time(Time&,inthour=0,intminute=0,intsec=0);

voidshow_time(Time&);Timet1;set_time(t1,12,23,34);show_time(t1);Timet2;set_time(t2);show_time(t2);

return0;}

voidset_time(Time&t,inthour=9,intminute=30,intsec=0){t.hour=hour;t.minute=minute;t.sec=sec;}

voidshow_time(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}第三十六页,共五十六页,编辑于2023年,星期四例:定义成员函数输入时分秒并输出#include<iostream>classTime{public:private:inthour;intminute;intsec;};intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();}

voidTime::set_time(){cin>>hour;cin>>minute;cin>>sec;}

voidTime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}第三十七页,共五十六页,编辑于2023年,星期四例#include<iostream>usingnamespacestd;classTime{public:

voidset_time();voidshow_time();private:inthour;intminute;intsec;};intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();return0;}

voidTime::set_time(){cin>>hour;cin>>minute;cin>>sec;}

voidTime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}第三十八页,共五十六页,编辑于2023年,星期四习题1第三十九页,共五十六页,编辑于2023年,星期四习题1#include<iostream>usingnamespacestd;classTime{public:

inthour;intminute;intsec;};Timet;voidset_time(void){cin>>t.hour;cin>>t.minute;cin>>t.sec;}voidshow_time(void){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}intmain(){set_time();show_time();return0;}第四十页,共五十六页,编辑于2023年,星期四例2.4P61#include<iostream>usingnamespacestd;classArray_max{public:voidset_value();voidmax_value();voidshow_value();private:intarray[10];intmax;};intmain(){Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0;}第四十一页,共五十六页,编辑于2023年,星期四2.6类的封装和信息隐蔽公用接口和私有实现的分离 我们已经学到,C++通过类的封装,将类的数据成员和成员函数集成到一个类中。而一般在类的声明时,往往把数据成员指定成私有的,使它们与外界隔离,即,不能在类外直接使用私有成员,外界只能通过类的公有函数,间接进行对私有成员的操作。换句话说,外界与类的私有成员的唯一联系渠道,就是该类的公有成员函数。 所以,我们一般把成员函数指定成公有的(public)性质(除非某些成员函数不想让外界调用)。 这就是所谓的“外部接口”与内部实现的分离,以起到信息隐蔽的作用。而这是软件工程最基本的原则。第四十二页,共五十六页,编辑于2023年,星期四定义一个类就是实现对创建一个对象的数据结构的描述。在类中,一些成员是保护的,被有效地屏蔽,以防外界的干扰和误操作。另一些成员是公共的,作为接口提供外界使用。右图是对它们采用的图示方法说明类的组成结构。以Point类为例。xoffsetyoffsetsetangleradiusxy封装体内部数据成员Point类访问接口第四十三页,共五十六页,编辑于2023年,星期四2.6类的封装和信息隐蔽类声明和成员函数定义的分离 当一个类被多个程序使用时,一般将类的声明(包括成员函数的声明)放在指定的头文件中,用户在编程时,将该头文件包含近来就可以了。而不必在每个使用该类的程序中重复书写该类的声明。 我们然后可以直接在程序中直接定义该类的对象,直接调用该类的公有成员函数。为了实现信息隐蔽,对类的成员函数的定义一般不放在头文件中,而放在另一个文件中。

然后按照对多文件程序的编译和运行方法对程序进行编译和连接。请看下面示例。 第四十四页,共五十六页,编辑于2023年,星期四2.6类的封装和信息隐蔽//rectangle.hclassrectangle{private: intlength,width;public: voidPut(); voiddisplay();};//rectangle.cpp#include<iostream.h>#include“rectangle.h”voidrectangle::Put(){length=5;width=4;}voidrectangle::display(){cout<<“area=“<<length*width<<endl;}//main.cpp#include<iostream.h>#include“rectangle.h”voidmain(){rectangler1;r1.display();}第四十五页,共五十六页,编辑于2023年,星期四2.6类的封装和信息隐蔽 在实际运用中,将若干功能相近的类声明集中在一起,形成类库。类库包括两个组成部分:类声明头文件;经过编译的头文件函数的定义的目标文件。 用户只需要将类库装入自己的计算机中C++系统的子目录下,并在程序中用#include命令将有关类声明的头文件包含到程序中,就可以使用这些类和其中的成员函数了。第四十六页,共五十六页,编辑于2023年,星期四2.6类的封装和信息隐蔽面向对象程序设计中的几个名词方法:method,指对数据的操作。消息:其实就是一个命令,由程序语句实现。外界通过发送“消息”来激活有关的方法。 比如: rectangle.dispaly();

就是向rectangle对象发一个消息,通知它执行其中的“display()”方法。 这一条语句就涉及到对象、消息、方法这三个术语。

rectangel:是对象;

display():是方法;

rectangel.display():是消息。第四十七页,共五十六页,编辑于2023年,星期四习题2#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();}第四十八页,共五十六页,编辑于2023年,星期四习题2#include<iostream>usingnamespacestd;classTime{public:voidset_time(void){cin>>hour;cin>>minute;cin>>sec;}

voidshow_time(void){cout<<hour<<":"<<minute<<":"<<sec<<endl;}

private:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();return0;}第四十九页,共五十六页,编辑于2023年,星期四习题3#include<iostream>classTime{public:private:

温馨提示

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

评论

0/150

提交评论