05 第五章 类与对象_第1页
05 第五章 类与对象_第2页
05 第五章 类与对象_第3页
05 第五章 类与对象_第4页
05 第五章 类与对象_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章类与对象 类的作用 类界面与类实现 类成员的访问控制 对象的创建 静态数据成员 构造函数与析构函数 成员对象的初始化5.1 面向对象的基本概念和特征1. 对象(Object)n 指将数据(内部状态)和使用这些数据的一组基本操作(行为)封装在一起的统一体。n 对象有时指一个事物,称实例(instance) 有时指一组类似的事物,称对象类(class)2. 信息隐藏n 将一个模块的内部数据或操作隐藏起来,其他模块只能通过该模块提供的公开操作来访问该模块n 信息隐藏由封装机制来实现。3.封装 : 用两种方法实现(1) 文件模块n 例子:P129采用文件模块来封装,实现循环计数器功能n 此程序共

2、包括2个源程序以及1个头文件n CIRNUM1.HPP (程序5.1.1 ) 头文件仅包含循环计数器对外公开的函数原型,不涉及内部数据与函数定义;n CIRNUM1.CPP (程序5.1.2 )该源程序是循环计数器的实现文件,以.CPP作为后缀名字,包括了内部数据及函数定义。 文件中引用CIRNUM1.HPP :#include cirnum1.hppn CIRDEMO1.CPP (程序5.1.3 )该源程序包括主函数,使用循环计算器(2) 类:用类实现封装n C+语言通过建立一个合适的循环计数器类, 将这些数据与函数结合在一起,形成一个新 的数据类型,称为类类型。4. 类与类的层次结构基类n

3、 具有一致数据结构(属性)和行为(操作)的对象可归并为一个类n 层次结构:n 上层称超类(基类、父类)派生类n 下层称子类(派生类)5.类的特征n 继承性n 具有层次关系的类的属性和操作进行共享的方式,后代类可以继承祖先类的各种性质n 多态性n 同一名字,多种语义;或相同界面,多种实现n 如:一个函数名代表了多种函数的实现5.2 类的定义一、类声明n 类是对一群具有相同属性、表现相同行为的对象的描述n 类的一般形式 :class 类名 public:公有数据和函数private:私有数据和函数;n 类中定义的数据(变量)称为数据成员类中定义的函数(行为操作)称为成员函数void increme

4、nt()环计数器类class CIRCULAR_NUMBERS public:vt_mode(int min, int max)int mode = max_val min_val + 1; current = (current min_val) + 1) %mode + min_val;d seoi例:/ 循环计数器加一循/ 设置循环计数器的上、下限min_val = min;max_val = max; return;void set_value(int value)/ 设置循环计数器的当前值current = value;return;return;void decrement()/ 循

5、环计数器减一int mode = max_val min_val + 1;current = (current min_val) - 1 + mode)% mode + min_val; return;int get_value()/ 查询循环计数器的当前值return current;private:;int min_val;/ 最小值int max_val;/ 最大值int current;/ 当前值说明n 类的数据成员允许是任何数据类型,但不能是本类类型的。正在定义的类名只可以以指针形式声明自己类中的数据成员class Link class Link Link member;Link *

6、member; 类中的数据成员不允许使用初值表达式class CIRCULAR_NUMBERS private:int min_val= 0 ;int max_val = 359 ; 类中的数据成员不允许使用auto,register,extern修饰,但允许使用static修饰,得到静态数据成员:供该类的所有对象公用 在类中 const 的使用I. const修饰数据成员:用于声明类中的一个常量数据成员。由于类的数据成员在声明时不能有初值表达式, 因此类的常量数据成员在声明时不能指定常量值。class C const double PI ;II. const修饰成员函数:常量成员函数,常量成

7、员函 数中不允许修改本类数据成员的值。class C int get_value() const ;二、类成员的访问控制指明成员的可访问性n 私有段:由private标记的段段内的数据成员和成员函数称为私有成员, 仅能由该类中的成员函数来访问,即仅可在成员函数定义中使用私有成员的名字。n 公有段:由public标记的段段内的数据成员和成员函数称为公有成员, 为该类提供与外部世界的接口界面,即可在类内也可在类外访问。n 类中每一个成员都有访问控制属性,若没有明确指明,成员的访问控制方式缺省为private。三、类界面与类实现n 类界面:头文件 *.hpp声明类,包括类的所有数据成员,以及成员函数

8、的原型n 类的成员函数可以在类内定义,也可以在类外定义。n 类实现:源程序 *.cpp首先要包含类界面:#include “*.hpp”然后定义成员函数,由于此时成员函数的定义是位于类的外面,因此必须用类名和作用域运算符:来修饰函数名。一般形式为:成员函数类型 类名:成员函数名(形参表)函数体例:/ 循环计数器加一void CIRCULAR_NUMBERS:increment()int mode = max_val - min_val + 1;current = (current - min_val) + 1) % mode + min_val; return;四、 标识符的类作用域n 内即为

9、类作用域n 在类作用域中声明的标识符只在该类中具有可见性n 成员名限定:类中一个成员名字可以使用类名和作用域运算符来显式指定class C void C:set(int val)valuepublic:C:value= val;void set(int val);return;private:int value;5.3 对象的创建n 类:数据类型n 具有类类型的变量称为对象,对象称为类的实例。int main()CIRCULAR_NUMBERS angle;/ 角度循环计数器CIRCULAR_NUMBERS month;/ 月份循环计数器angle.set_mode(0, 359);/ 设置角

10、度取值范围从0到359 angle.set_value(250);/ 设 置 当 前 角 度 为 250 month.set_mode(1, 12);/ 设置月份取值范围从1到12month.set_value(11);类/ 设置当前月为11月11121set_mode()代码set_value()代码get_value()代码increment()代码decrement()代码对象angleCIRCULAR_NUMBER对象month3590min_val max_val current set_mode() set_value() get_value() increment() decre

11、ment()250min_val max_val current set_mode() set_value() get_value() increment() decrement()用static修饰的数据成员:被分配占用一个固定的存储空间,由此类的所有对象共享,对于类来说:静态数据成员相当于类的全局变量。使用方法:静态数据成员1) 在类的界面中(定义)声明一个静态数据成员2) 在类实现中,必须再次声明并初始化这个静态数据变量/ test1.hpp/ test1.cppclass C #include “test1.hpp”private: int x;int C:s = 18 ;int y;

12、static int s;int C:set(int i, int j) public:x = i;int set(int,int);y = j ;s+;3) 使用/ test.cpp#include “test1.hpp”void main( )Cc1, c2; c1.set(100,200);c2.set(15, 30);200100x yset()类C1819set ()代码s:20对象c1对象c23015x yset()二、使用对象成员n 通过成员选择运算符.来访问/使用对象的公有成员n 类的对象名.公有段成员函数名(实参表)一、构造函数5.4 对象的初始化n 类中的一个特殊函数n 功

13、能:对该类的对象进行初始化n 一般形式:类名(形式参数表);n 特点:n 构造函数是公有的,可由用户提供,也可由系统提供缺省的。n 构造函数可以有任何类型的形参,但是无返回值, 也不能指定返回类型。n 构造函数在声明一个新对象时调用(对象声明语句中为构造函数提供实参),不可显式调用class CIRCULAR_NUMBERS public:CIRCULAR_NUMBERS(int min, int max, int value);5.4.2程序例:/ 设置循环计数器的上下限和当前值/ 设置循环计数器的上下限和当前值CIRCULAR_NUMBERS:CIRCULAR_NUMBERS(int mi

14、n, int max, int value)min_val = (min = max) ? min : max; max_val = (min = max) ? max : min; if (value max_val) current = max_val; else current = value;return;int main()/ 创建两个循环计数器对象并初始化CIRCULAR_NUMBERS angle(0, 359, 250);/ 角度循环计数器CIRCULAR_NUMBERS month(1, 12, 11);/ 月份循环计数器二、析构函数n 类中的一个特殊函数n 功能:为一个类的

15、对象做善后清理工作(如:回收存储空间)n 一般形式:类名( );n 特点:n 析构函数是公有的,可由用户提供,也可由系统提供缺省的。n 析构函数不可带任何参数,无返回值,也不能指定返回类型。n 在对象生存期结束时,程序将自动调用该对象所属类的析构函数,调用且仅调用一次。例:#include class DEMO_CLASS public:DEMO_CLASS(int i);DEMO_CLASS(); DEMO_CLASS:DEMO_CLASS(int i)cout Initial value is i n;return; DEMO_CLASS:DEMO_CLASS()cout Goodbye!

16、n;return;int main()DEMO_CLASS obj(30);/ 声明一个对象cout This is the end of main().n;return 0;运行结果:Initial value is 30This is the end of main(). Goodbye!三、对象成员的初始化n 对象成员:在一个类中声明具有类类型的数据成员n 初始化对象成员的方法:在本类的构造函数中调用这些对象成员所属类的构造函数,其一般形式:类名:类名(形参表):初始化列表 class A public:B:B():obj2(10,20), obj1(5,3)A(int a, float

17、 b); ;class B A obj1, obj2; public:B();说明n 如果有多个对象成员,对象成员构造函数的调用次序取决于这些成员在类中声明的次序。n 执行次序:创建类的对象时,调用此类的构造函数, 先根据初始化列表调用对象成员的构造函数, 初始化对象成员,然后才执行本身的构造函数的函数体。析构函数调用的次序相反。例类中包含有另一个类的对象(对象成员)的例子(在构造函数和析构函数中加入输出以便跟踪)#include class Objectint val; public:Object( );/构造函数Object( int i );/构造函数Object( );/析构函数;Ob

18、ject:Object( )val=0;coutn Default constructor for Object.n;Object:Object( int i)/构造函数定义val=i;coutn Constructor for Object: valendl;Object:Object( ) /析构函数定义coutn Destructor for Object: valendl;class Container /定义新类,它含Object的对象 private:public:;int date;Object one;/对象成员Object two;/对象成员Container( );/构造函

19、数Container( int i, int j, int k);/构造函数Container( ); /析构函数Container:Container( ) /构造函数定义 date=0;coutn Default constructor for Container.n;Container:Container( int i, int j, int k):two(i),one(j) date=k;coutn Constructor for Container.n;Container:Container( ) coutn Destructor for Container.n; void main

20、( )/演示程序 coutn. Entering main .n;Container obj(5,6,10); coutn. Exiting main .n;n 执行结果为:. Entering main .Constructor for Object: 6/对象one调用构造函数Constructor for Object: 5/对象two调用构造函数Constructor for Container. /调用Container的构造函数.Exiting main .Destructor for Container./调用Container的析构函数Destructor for Object: 5/调用two的析构函数Destructor for Object: 6/调用one的析构函数初始化列表的其他用途n 基本数据类型的数据成员也可用初始化列表做初始化class C public:C(int i):number(i)C(int i) number = i;private:int number; 常量数据成员的初始化常量数据成员:不能在类的声明中初始化(类中不能用初值表达式) 不能在构造函数中设置其值(赋值操作不能用于常量) 只能采

温馨提示

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

评论

0/150

提交评论