第9章_类与对象

上传人:今*** 文档编号:108196013 上传时间:2019-10-22 格式:PPT 页数:112 大小:2.26MB
返回 下载 相关 举报
第9章_类与对象_第1页
第1页 / 共112页
第9章_类与对象_第2页
第2页 / 共112页
第9章_类与对象_第3页
第3页 / 共112页
第9章_类与对象_第4页
第4页 / 共112页
第9章_类与对象_第5页
第5页 / 共112页
点击查看更多>>
资源描述

《第9章_类与对象》由会员分享,可在线阅读,更多相关《第9章_类与对象(112页珍藏版)》请在金锄头文库上搜索。

1、1,第9章 类与对象,第9章 类与对象,2,第9章 类与对象,9.1 类的定义和声明 9.2 对象的定义和使用 9.3 构造函数和析构函数,第9章 类与对象,3,结构化程序设计 复杂的大问题-层层分解/模块化-若干子问题 自顶向下,逐步求精 一个main函数+若干子函数,在构化程序设计中:,第9章 类与对象,4,变量: 函数:,var1,var2,var3,main(),sub1(),sub2(),sub3(),sub4(),sub5(),第9章 类与对象,5,结构化程序设计面对的四大囧境:,理解难,修改难,查错难,重用难,第9章 类与对象,6,更正确,更经济,更快,软件业需要面向对象 软件设

2、计的目标:,第9章 类与对象,7,面向对象的程序设计方法: 面向对象的程序 = 类 + 类 + + 类 设计程序的过程-设计类的过程,第9章 类与对象,8,面向对象的程序设计方法:,一类 事物,共同属性-数据结构 行为-函数,Data Fuction,class,类,抽象,封装,第9章 类与对象,9,面向对象的程序模式:,main(),第9章 类与对象,10,如果你是Gru,面对如此千姿百态的小黄人,怎么处理?,第9章 类与对象,11,第9章 类与对象,12,第9章 类与对象,13,类的定义:,class 类名 访问范围说明符: 变量1 变量2 函数1 函数2 访问范围说明符: 更多变量 更多

3、函数 ;,第9章 类与对象,14,15,9.1 类的定义和声明,类(class)是用户自定义数据类型。如果程序中要使用类类型(class type),必须根据实际需要定义,或者使用已设计好的类。 C+定义一个类,其方法与定义一个结构体类型是相似的,一般形式为:,class 类名 /类体 成员列表 ;,16,9.1.1 类的定义,类成员可以是数据或函数。 所有成员必须在类的内部声明,一旦类定义完成后,就没有任何其他方式可以再增加成员了。,17,9.1.1 类的定义,类定义时必须给出各个数据成员(data member)的数据类型声明,其一般形式为:,class 类名 /类体 数据成员类型 数据成

4、员名列表; /数据成员声明 ;,18,9.1.1 类的定义,每个类可以包含成员函数,能够访问类自身的所有成员。 在类体内部,定义成员函数的方法有两种:,19,9.1.1 类的定义,成员函数定义(也是声明)在类定义中,形式如下:,class 类名 /类体 返回类型 函数名(形式参数列表)/成员函数定义 函数体 ;,20,9.1.1 类的定义,成员函数声明在类中,定义在类外部,形式:,class 类名 /类体 返回类型 函数名(类型1 参数名1,类型2 参数名2,); ; 返回类型 类名:函数名(形式参数列表) 函数体 ,21,9.1.1 类的定义,class Data /Data类定义 void

5、 set(int d); int get() return data; int data; /数据成员 ; void Data:set(int d) data=d; /访问类的数据成员 ,22,9.1.1 类的定义,类定义一般放在程序文件开头,或者放到头文件中被程序文件包含,此时这个定义是全局的。在全局作用域内,该定义处处可见,因此同作用域内的所有函数都可以使用它。 类定义也可以放到函数内部或局部作用域中,此时这个定义是局部的。若在函数内部有同名的类定义,则全局声明在该函数内部是无效的,有效的是局部定义的。 一般地,由于类是为整个程序服务的,因此很少有将类放到局部作用域中去定义。,23,9.1

6、.2 成员访问控制,对类的成员进行访问,来自两个访问源:类成员和类用户。 类成员指类本身的成员函数,类用户指类外部的使用者,包括全局函数、另一个类的成员函数等。,24,9.1.2 成员访问控制,无论数据成员还是函数成员,类的每个成员都有访问控制属性:public(公有的)、private(私有的)和protected(保护的)。 公有成员用public标号声明,类成员和类用户都可以访问公有成员,任何一个来自类外部的类用户都必须通过公有成员来访问。显然,public实现了类的外部接口。,25,9.1.2 成员访问控制,私有成员用private标号声明,只有类成员可以访问私有成员,类用户的访问是不

7、允许的。显然,private实现了私有成员的隐蔽。 保护成员用protected标号声明,在不考虑继承的情况下,protected的性质和private的性质一致,但保护成员可以被派生类的类成员访问。,26,9.1.2 成员访问控制,成员访问控制是C+的类和结构体又一个重要特性。加上访问标号,类定义更一般的形式为:,class 类名 /类体 public: /公有访问权限 公有的数据成员和成员函数 protected: /保护访问权限 保护的数据成员和成员函数 private: /私有访问权限 私有的数据成员和成员函数 ;,27,9.1.2 成员访问控制,如果没有声明访问控制属性,类所有成员默

8、认为private,即私有的。例如:,class Data int a, b; /默认为私有的,外部不能直接访问 public: void set(int i, int j,int k,int l,int m,int n) a=i,b=j,c=k,d=l,e=m,f=n; protected:/保护的,外部不能直接访问 int c, d; private:/私有的,外部不能直接访问 int e, f; ; Data d1; d1.set(1,2,3,4,5,6); d1.a=100; /错误 d1.c=20; /错误,28,9.1.2 成员访问控制,Data类的数据成员均是外部不能直接访问的,

9、这使得类的数据被“隐蔽”起来,是“安全的”。但成员函数set是公有的,外部可以直接访问。从以上代码可知,通过set设置了数据成员,因此set成员函数是外部访问数据成员的“接口”。 实际编程中,为了使程序清晰,每一种成员访问限定符在类体中只出现一次,且按照public、protected、private顺序组织,形成访问权限层次分明的结构。,29,9.1.3 类的数据成员,1在类中声明数据成员 类的数据成员可以是基本类型、数组、指针、引用、共用体、枚举类型、void指针、const限定等数据类型。例如:,class ADT /类成员数据类型 /成员函数 long color; double x,

10、y,z,side; /基本类型 int a10; /数组 char *s; /指针 char ,30,9.1.3 类的数据成员,2在类中定义或声明数据类型 除了定义数据和成员函数之外,类还可以定义自己的局部类型。 在类中定义或声明的数据类型的作用域是类内部,因此,它们不能在类外部使用。,31,9.1.3 类的数据成员,class ADT /类定义 struct Point int x,y; ; /定义结构体 union UData Point p; long color; ; /定义共用体 enum COLORS RED,GREEN,BLUE,BLACK,WHITE ; /定义枚举类型 cla

11、ss Nested /嵌套类定义 /成员函数 Point start; /数据成员 UData end; /数据成员 COLORS color; /数据成员 ; /成员函数 /数据成员 ; /类定义结束,32,9.1.4 类的成员函数,1在类的外部定义成员函数 如果成员函数仅有声明在类定义中,则在类外部必须有它的实现,其一般形式为:,返回类型 类名:函数名(形式参数列表) 函数体 ,33,9.1.4 类的成员函数,例如:,class Data /Data类定义 public: void set(int d); /成员函数原型声明 int get() return data; private:

12、int data; /数据成员 ;,34,9.1.4 类的成员函数,void Data:set(int d) /使用 Data: 限定 data=d; /访问类的数据成员 void set(int d) /全局普通函数 data=d; /错误 ,35,9.1.4 类的成员函数,2内联成员函数 类的成员函数可以指定为inline,即内联函数。 默认情况下,在类体中定义的成员函数若不包括循环等控制结构,符合内联函数要求时,C+会自动将它们作为内联函数处理(隐式inline)。,36,9.1.4 类的成员函数,可以显式地将成员函数声明为inline。例如:,class Data /Data类定义 i

13、nt getx() return x; /内联成员函数 inline int gety() return y; /显式指定内联成员函数 inline void setxy(int _x, int _y); /显式指定内联成员函数 void display(); int x, y; ; inline void Data:setxy(int _x, int _y) /内联成员函数 x=_x, y=_y; void Data:display() /非内联成员函数 /函数体 ,37,9.1.4 类的成员函数,总结下来,成员函数是否内联的,有以下几条: 符合内联函数要求; 符合的条件,并且在类体中定义,

14、自动成为内联的; 符合的条件,在类体显式指明inline,或在外部定义时显式指明inline,或者同时显式指明,则函数是内联的; 在类外部定义,并且既没有在类体,也没有在外部定义时显式指明inline,则函数不是内联的。,38,9.1.4 类的成员函数,3成员函数重载及默认参数 对成员函数重载或使用默认参数。例如:,class MAX int Max(int x,int y) return xy?x:y; int Max() return Max(Max(a,b),Max(c,d); /重载Max int Set(int i=1,int j=2,int k=3,int l=4) a=i,b=j

15、,c=k,d=l; /默认参数 int a,b,c,d; /数据成员 ;,39,9.1.4 类的成员函数,需要注意,声明成员函数的多个重载版本或指定成员函数的默认参数,只能在类内部中进行。,40,9.1.4 类的成员函数,4成员函数的存储方式 用类实例化一个对象时,系统会为每一个对象分配存储空问。如果一个类包括了数据成员和函数成员,则要分别为数据和函数的代码分配存储空间。 通常,C+会为每个对象的数据成员分配各自独立的存储空间,像第8章讲到的结构体成员那样。,41,9.1.4 类的成员函数,那么在类中的成员函数是否会如图9.1(a)所示那样也分配各自独立的存储空间呢?,42,9.1.4 类的成员函数,一般情况下,不同对象的数据成员是不相同的,因而需要不同的空间存储它们; 而不论调用哪一个对象的成员函数,实际调用的都是同样内容的代码。因此,若像图9.1(a)那样存放相同代码的多份副本,既浪费空间又无必要。 实际上,C+每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,而不包括成员函数所占用的存储空间。成员函数代码只有公用的一个,调用不同对象的成员函数时都是执行同一段函数代码。,43,9.1.4 类的成员函数,图9.1 成员函数的存储方式,44,9.1.4 类的成员函数,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号