第11章类和对象.ppt
《第11章类和对象.ppt》由会员分享,可在线阅读,更多相关《第11章类和对象.ppt(94页珍藏版)》请在三一文库上搜索。
1、第11章 类和对象,11.1 面向对象的思想 11.2 面向对象程序设计的基本特点 11.3 面向对象软件开发的基本过程 11.4 类和对象 11.5 构造函数与析构函数 11.6 友元 11.7 静态成员 11.8 const对象和成员函数 11.9 应用实例 作业:10,13,14,15,11.1 面向对象的思想,什么是面向过程?什么是面向对象? 两种不同的思想、方法。 面向过程的程序设计 用传统程序设计语言进行程序设计时,必须详细地描述解题的过程。程序设计工作主要围绕设计解题过程来进行,这种传统的程序设计方法称为面向过程的程序设计。,面向过程程序设计,特点 程序处理数据的一系列过程; 数
2、据与过程分离; 程序数据结构算法 缺点 重用性差 维护困难,面向对象程序设计,面向对象程序设计:将面向对象方法用于程序设计。 出发点与基本原则: 模拟人类习惯思维方式,使开发软件的方法尽可能接近人类认识世界解决问题的方法。 对象作为模块,对象是对客观事物的自然的、直接的抽象和模拟,包含了数据及对数据的操作。,11.2 面向对象程序设计的基本特点,封装性 将描述对象的数据及处理这些数据的代码集中起来放在对象内部,对象成为独立模块。 继承性 从已有类(称为基类)派生出新类。 多态性 同一个名字代表不同、但相似的功能。,11.3 面向对象软件开发的基本过程,软件危机促进了软件工程的形成与发展。 软件
3、工程:用系统工程学的原理和方法管理软件开发过程,开发过程分为分析、设计、编程、测试、维护等阶段。 面向对象的软件工程 分析:明确系统必须做什么。 设计:明确软件系统怎么做。 实现:选用合适的面向对象编程语言,实现设计阶段描述的软件系统的各个类模块,并根据类的相互关系集成。 测试:发现软件中的错误。 维护:在软件交付用户使用期间,对软件所作的修改。,11.4 类和对象,在面向对象程序设计中,对象是构成程序的模块,即程序是由一组对象构成的,对象之间通过消息分工协作,共同完成程序的功能。 类是面向对象程序设计的核心,是对具有相同属性与行为的一组事物的抽象描述。利用类可以把数据和对数据所做的操作组合成
4、一个整体,实现对数据的封装和隐藏。 类是用户自定义的数据类型,是创建对象的模型。,11.4.1 类的定义,1格式,关键字,class 类名 成员1说明; 成员2说明; 成员n说明; ;,类定义体,分号不可缺!,2类的组成成员 数据成员: 变量或对象。其类型为:,成员函数 对数据成员进行操作。,例: class Circle private: int radius; public: void setRadius(int r) radius=r; double area( ) return 3.14*radius*radius; ;,数据成员,函数成员1,?,函数成员2,在定义一个类时,注意: 类
5、只是一种自定义数据类型,类中任何成员数据均不能使用关键字extern、auto或register指定其存储类型,也不能初始化。例如: class Circle int radius=5; /错误 extern float pi; /错误 /省略其它成员 ; 成员函数可直接使用类中的任一成员。 类类型与结构体类型相似,结构体类型也可有函数成员,差别在于,类类型的缺省访问权限是private,结构体类型的缺省访问权限是public。,11.4.2 类成员的访问控制,在定义类时,指定其成员访问权限的原则: 仅供该类的成员函数访问的成员应指定为私有的。 若定义的成员在派生类中也需经常使用,则应指定其为
6、保护的。 若允许在类外使用成员时,应将其访问权限定义为公有的。,11.4.3 类的成员函数及重载,成员函数必须在类体内给出原型说明,至于它的实现,可以放在类体内,也可以放在类体外。 当成员函数所含代码较少时,一般直接在类中定义该成员函数; 当成员函数中所含代码较多时,通常只在类中进行原型的说明,在类外对函数进行定义。,例: class Person char name12; int age; char sex4; public: void Print( ) coutname,age,sexendl; /省略其它成员 ;,在类中定义的成员函数,在类外定义成员函数时,函数名应该包含: 类名作用域分
7、辩符(:)原函数名,指明该函数是哪个类的成员,class Person char name12; int age; char sex4; public: void Print ( ) ; /省略其它成员 ; void Person : Print( ) coutname,age,sexendl; ,例:,在类中声明成员函数的原型,在类外定义成员函数,类的成员函数可以重载,例: class Person char name12; int age; char sex4; public: void SetPerson(const char*,int,const char* =“女“); void S
8、etPerson(int); /省略其它成员 ;,成员函数重载,缺省参数,11.4.4 对象,对象的本质 一个对象就是一个类的实例。一个对象就是一个具有某种类类型的变量。 对象的定义格式: 类名 对象名;,例: Person p1,p2;,公共代码区,SetPerson() GetName() GetSex() Print(),p1 p2,访问对象的成员,对象名.数据成员名 对象名.成员函数名(参数表) 对象指针名-数据成员名 对象指针名-成员函数名(参数表),访问对象的成员时,要注意成员的访问权限。,例: #include class Rectangle float length,width
9、; public: float Area( ) return length*width; float Perimeter( ) return 2*(length+width); ;,private:,以关键字class定义的类,成员的缺省访问属性为private。,void main( ) Rectangle r; r.width=45; r.length=54.2; cout“the area of rectangle is“ r.Area()endl; cout“the perimeter of rectangle is“ r.Perimeter()endl; ,非法访问 私有成员!,#i
10、nclude class Rectangle float length,width; public: void SetWidth(float newWidth) width=newWidth; void SetLength(float newLength) length=newLength; float Area( ) return length*width; float Perimeter( ) return 2*(length+width); ;,例:,void main( ) Rectangle r; /定义对象 r.SetWidth(45); r.SetLength(54.2); co
11、ut“The area of rectangle is“ r.Area( )endl; cout“The perimeter of rectangle is “ r. Perimeter( )endl; ,11.4.5 对象数组,若一个数组中每个元素都是同类型的对象,则称该数组为对象数组。 定义一维对象数组的格式为: ;,例11.5 对象数组的使用。 #include class Circle int radius; public: void setRadius(int r) radius=r; int getRadius( ) return radius; double area( ) re
12、turn 3.14*radius*radius; ; void main( ) Circle c3; c0.setRadius(6); c1.setRadius(2); c2.setRadius(15); for(int i=0;i3;i+) cout“radius:“ci.getRadius( ) “,area:“ci.area( )endl; ,类Circle的定义,定义对象数组,11.4.6 this指针,一个成员函数被调用时,系统自动向它传递一个隐含的指针,该指针是调用该成员函数的对象的指针,在成员函数的函数体中可直接用this使用该指针。 在成员函数的实现中,当访问该对象的某成员时,
13、系统自动使用这个隐含的this指针。在定义成员函数的函数体时,通常省略this指针。 例:Circle类的成员函数 void setRadius(int r) radius=r; ,this-,this指针具有如下的缺省说明: Circle *const this;,有时不得不显式使用this指针。 数据成员名与函数成员的形参同名。例: class Name char* name; public: void SetName(char* name) if(name) this-name=new charstrlen(name)+1; strcpy(this-name,name); else th
14、is-name=NULL; ;,引用对象本身。例: class Name char* name; public: void CopyName(Name,11.5 构造函数和析构函数,构造函数和析构函数:类的特殊成员。 构造函数: 创建对象,并初始化对象的数据成员。 析构函数: 撤销对象,收回它所占内存,及完成其它清理工作。,11.5.1 构造函数,构造函数的定义格式 ClassName() /函数体,它与所在类同名。 它不得有返回值,甚至连关键字void也不许有。,例:,class Person char name12; int age; char sex4; public: Person(c
15、onst char*n,int a,const char*s) strcpy(name,n); age=a; strcpy(sex,s); /省略其它成员函数 ;,例:,class Person char name12; int age; char sex4; public: Person(const char* n,int a,const char* s); /其它成员函数说明 ; Person:Person(const char* n,int a,const char* s) strcpy(name,n); age=a; strcpy(sex,s); ,也可在类中声明原型,在类外定义。,构
16、造函数的特殊性:,构造函数在定义类对象时由系统自动调用。例:,void main( ) Person p(“张三”,20, “男” ); ,当遇此定义语句时,系统就调用构造函数: Person(const char* n,int a,const char* s) 创建对象p,并用实参初始化它的数据成员。,构造函数可以重载。例:,class Point float x,y; public: Point( )x=0;y=0; /(1) Point(float a,float b)x=a;y=b; /(2) / ; void main( ) Point p1; /匹配(1) Point p2(2.0
17、,4.2); /匹配(2) ,构造函数中初始化数据成员的方法,在函数体中用赋值等语句进行 使用成员初始化列表,初始化列表,格式: 在形参表和函数体之间,以:号开头,由多个以逗号分隔的初始化项构成。即 :数据成员名1(初值1),数据成员名n(初值n) 举例: Person:Person( ):name(“zhang“),age(22) strcpy(sex,“男“); 执行顺序:带有初始化表的构造函数执行时,首先执行初始化表,然后再执行函数体。,数据成员的初始化,普通数据成员的初始化既可在函数体进行,也可在初始化表进行。例:,(方法1) Point:Point(int x1,int y1) x=
18、x1; y=y1; 或(方法2) Point:Point(int x1,int y1):x(x1),y(y1) ,const数据成员、const对象成员和从基类继承的数据成员的初始化必须用初始化表。,缺省的构造函数,C+规定,每个类至少有一个构造函数,否则就不能创建该类的对象。例:,class Rectangle float length,width; public: float Area( ); float Perimeter( ); ; /类的实现 void main( ) Rectangle rect; ,能否创建Rectangle类的对象?,类中若未定义构造函数,则C+编译系统自动提供
19、一个缺省的构造函数。缺省的构造函数无参,函数体为空,仅创建对象,不作任何初始化工作。,class Rectangle float length,width; public: float Area( ) ; float Perimeter( ); ; /类的实现 void main( ) Rectangle rect; ,因系统提供了默认的构造函数: Rectangle( ) ,只要类中定义了一个构造函数,C+编译器就不再提供缺省的构造函数,如还想要无参构造函数,则必须自己定义。例: class Circle int radius; public: Circle(int r) radius=r;
20、 /(1) ; Circle c1; Circle c2(5);,因该类有带一个参数的构造函数,故系统不再提供无参的缺省构造函数!,匹配(1),没有无参构造函数,对上例的修改方法1: class Circle int radius; public: Circle(int r) radius=r; /(1) Circle( ) /(2) ; Circle c1(3); Circle c2;,匹配(1),匹配(2),添加无参构造函数!,对上例的修改方法2 : class Circle int radius; public: Circle(int r=0) radius=r; /(1) ; Circ
21、le c1(3); Circle c2;,匹配(1),匹配(1),参数带默认值的构造函数! 所有参数都带默认值的构造函数也是缺省的构造函数。,使用参数带缺省值的构造函数时,应防二义性。如: class Circle int radius; public: Circle() /L1 Circle(int r=0) radius=r; /L2 ; Circle c1; /L3 错误!产生二义性 Circle c2(5); /匹配L2行的构造函数 当编译L3行的语句时,出错。因Circle类定义了两个缺省的构造函数,编译器不知道是调用L1行定义的Circle( )还是调用L2行定义的Circle(i
22、nt r=0)。,11.5.2 析构函数,作用: 与构造函数相反,在对象被撤消时由系统自动调用,做清理工作。 特点: 析构函数名必须与类名相同,并在其前面加上字符“”,以便和构造函数名相区别。 析构函数没有返回值,函数名前也不能用关键字void。 析构函数没有参数,换言之,析构函数是唯一的,析构函数无法重载。,例11.9 调用析构函数。 #include class Point int x,y; public: Point() x=y=0;cout“Default constructor called.n“; Point(int a,int b) x=a;y=b; cout“Construct
23、or with parameters called.n“; Point( ) cout“Destructor called.“x,yn; void print( ) coutx,yn; ;,为了观察调用构造函数和析构函数的过程,分别在构造函数和析构函数内添加了输出调用信息的语句。,void main( ) Point p1(5,8),p2; p1.print( ); p2.print( ); Point p2(3,2); p2.print(); cout“Exit main!n“; ,程序运行结果: Constructor with parameters called. Default con
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 对象
链接地址:https://www.31doc.com/p-3123480.html