清华c+语言程序设计:第11章 类和对象

上传人:tia****nde 文档编号:70783862 上传时间:2019-01-18 格式:PPT 页数:72 大小:463.31KB
返回 下载 相关 举报
清华c+语言程序设计:第11章 类和对象_第1页
第1页 / 共72页
清华c+语言程序设计:第11章 类和对象_第2页
第2页 / 共72页
清华c+语言程序设计:第11章 类和对象_第3页
第3页 / 共72页
清华c+语言程序设计:第11章 类和对象_第4页
第4页 / 共72页
清华c+语言程序设计:第11章 类和对象_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《清华c+语言程序设计:第11章 类和对象》由会员分享,可在线阅读,更多相关《清华c+语言程序设计:第11章 类和对象(72页珍藏版)》请在金锄头文库上搜索。

1、第11章 类与对象,讲授内容,数据抽象的概念 类的特点和作用 类的定义 类的访问控制 类的数据成员和成员函数 类的静态成员 类的对象 类的构造函数和析构函数,11.1 数据抽象的概念(1/4),对象描述问题空间的实体 程序设计的角度:对数据和操作的封装 真实世界的角度:问题空间的实体 问题空间的哪些实体需要描述? 对于一个实体,对象需要描述该实体的哪些方面?,11.1 数据抽象的概念(2/4),用面向对象的方法描述一个系统 设计的系统中的对象必须能很好地描述问题空间的实体 读者Reader怎么描述? 对象之间必须能互操作或互通消息 读者Reader和图书馆管理员librarian之间如何互操作

2、 对象之间必须允许存在某种关系,如包含关系等,11.1 数据抽象的概念(3/4),数据抽象忽略一个主题中与当前问题无关的方面,以便更充分地注意与当前问题有关的方面 不是去了解和描述问题的全部 只是选择其中相关的一部分,11.1 数据抽象的概念(4/4),数据抽象的步骤 确定问题空间,明确要解决的问题 图书馆管理系统要解决的问题是什么? 确定问题空间的实体 哪些实体和要解决的问题相关 对实体进行抽象 对于每一个实体,确定要描述的东西 用数据结构和函数描述上面的结果,11.2 抽象数据类型(1/13),对问题空间的实体进行抽象 包含哪些属性(数据)和功能(函数) 抽象的结果对数据和函数的封装 类(

3、class)抽象数据类型,实现对数据和函数的封装 自定义类是一种新的数据类型,11.2 抽象数据类型(2/13),结构化程序设计 全局数据(变量、数组、结构等)具有文件作用域 任何函数都可以访问他们 程序可维护性差,11.2 抽象数据类型(3/13),类和对象的封装和访问控制 封装是面向对象的重要特征之一 类封装了数据和函数 类定义了函数和数据的访问控制属性 哪些成员可被外界直接访问 哪些成员只能被自己的成员函数访问 提高了程序的可维护性 类的数据成员最好都是私有的,11.2 抽象数据类型(4/13),接口与实现的分离 类的使用者关心类的接口类的公有数据成员和函数,即他能访问的部分 类的设计者

4、关心类的实现 接口与实现的分离使程序员能将精力集中到自己关心的部分 接口与实现的分离有利于多人(方)合作,例子1:用结构实现栈(1/5),/ex11_1.cpp #include struct Stack /结构定义 int *data; /栈数据存储 int memNum; /栈元素个数 int size; /栈大小 ; int initStack(Stack /函数原型,例子1:用结构实现栈(2/5),/初始化栈 int initStack(Stack ,例子1:用结构实现栈(3/5),/弹栈,无数据时返回0,否则返回1 int popStack(Stack ,例子1:用结构实现栈(4/5

5、),main() int i, num; Stack newStack; initStack(newStack, 10); cout“Push integers to stack :“endl; for (i=0;i10;i+) couti“ “; pushStack(newStack, i); coutendl; cout“From function popStack :“endl; for (i=0; i10; i+) if (popStack(newStack, num) coutnum“ “; coutendlendl;,例子1:用结构实现栈(5/5),for (i=10;i20;i+

6、) newStack.datanewStack.memNum+ = i; cout“Reading from struct newStack :“endl; for (i=0;i10;i+) coutnewStack.datai“ “; coutendl; for (i=10;i20;i+) coutnewStack.datai“ “; coutendl; delStack(newStack); return 0; ,程序运行结果:,Push integers to stack : 0 1 2 3 4 5 6 7 8 9 From function popStack : 9 8 7 6 5 4

7、 3 2 1 0 Reading from struct newStack : 10 11 12 13 14 15 16 17 18 19 -33686019 0 0 0 97 113 4391232 4391024 4350028 21,11.2 抽象数据类型(5/13),使用结构时的一些缺陷 通过专门的函数使用时没有问题 直接操作时可能会出错,任何函数都可以直接操作 可能会被赋予不恰当的值,或破坏默认的操作流程,如栈的先进后出 数据和函数的相关性也没有体现,所有函数都是平等的 根本原因对数据的访问权限问题 封装和隐藏机制可以克服该问题,例子2:用类实现抽象数据类型:栈(1/5),/文件st

8、ack.h /类Stack的定义 class Stack public: Stack(int s); Stack(); int pop(int ,例子2:用类实现抽象数据类型:栈(2/5),/文件stack.cpp /类Stack的实现 #include “stack.h“ Stack:Stack(int s) data = new ints; size = s; memNum = 0; /析构函数 Stack:Stack() delete data; ,例子2:用类实现抽象数据类型:栈(3/5),/弹栈函数,不成功返回0,成功则返回1,栈元素由参数返回 int Stack:pop(int ,

9、例子2:用类实现抽象数据类型:栈(4/5),/文件ex11_2.cpp #include “stack.h“ #include main() int i, num; Stack myStack(10); cout “Push: “; for (i=0; i11; i+) if (!myStack.push(i) coutendl“Push “i“ failed.“endl; else cout i “ “; ,例子2:用类实现抽象数据类型:栈(5/5),cout “Pop: “; for (i=0; i11; i+) if (myStack.pop(num) coutnum“ “; else

10、coutendl“Pop failed.“; coutendl; return 0; ,程序运行结果:,Push: 0 1 2 3 4 5 6 7 8 9 Push 10 failed. Pop: 9 8 7 6 5 4 3 2 1 0 Pop failed.,11.2 抽象数据类型(6/13),类Stack封装了与栈相关的数据和函数 访问说明符public和private定义了类成员的访问属性 Public:定义类的公有成员 能访问到类的对象就能直接访问对象的公有成员 Private:定义类的私有成员 私有成员只能被该类的成员函数访问到 每一种访问说明符都可以在类中多次出现,11.2 抽象数

11、据类型(7/13),构造函数 函数名和类名完全相同 没有返回类型 作用:初始化类的对象 一个类可以有多个构造函数 创建类的对象时,自动调用类的构造函数 创建一个对象时只调用一个构造函数(根据参数列表)且只在创建时调用一次 构造函数可以确保对象在使用前被初始化,11.2 抽象数据类型(8/13),析构函数 函数名和类名相似(前面多了一个字符“”) 没有返回类型 没有参数 析构函数不能被重载 作用:撤销对象前做清理工作,一般是释放对象在生存期间动态申请的空间 撤销类的对象时,自动调用类的析构函数,11.2 抽象数据类型(9/13),定义好的类可以作为新的数据类型来使用 Stack oneStack

12、; /Stack类型的对象 Stack arrayOfStack10; /Stack类型的对象数组 Stack *pStack; /Stack类型的指针 Stack / 引用一个Stack对象,11.2 抽象数据类型(10/13),类的定义和实现一般在不同的文件中 类的定义一般放在一个头文件中,供其它需要使用该类的文件包含 类的实现部分一般在一个源文件中,该文件需要包含定义类的头文件 类的定义和实现可以放在一个文件里,但不提倡,因为结构不清晰,11.2 抽象数据类型(11/13),类成员函数的实现在类的定义外面时,必须声明其所属,例如: int Stack:pop(int &num) 其中St

13、ack为类名,:是作用域运算符 类成员函数的实现也可以放在类里,不需要加类名和作用域运算符 类的数据成员只能在类里声明,不能在类里初始化,11.2 抽象数据类型(12/13),创建类的对象时会自动调用构造函数初始化对象 如果构造函数需要参数则声明对象时要提供相应的参数,如 Stack myStack(10); 系统根据提供的参数列表确定要调用的构造函数,11.2 抽象数据类型(13/13),封装和信息隐藏技术使类变得很安全 私有数据成员只有类自己的成员函数能访问 只要确保成员函数操作的合理合法性,对象就是安全的 接口和实现的分离使得类的实现被独立出来 类的实现部分的修改不会影响到程序的其他部分

14、,11.3 类和对象的定义(1/12),数据成员 可以定义各种类型的变量、指针、数组等,甚至是其他类的对象 在类的定义中只能声明数据成员,不能赋值 数据成员一般放在private部分,外界通过公有成员函数访问他们 数据成员也可以放在public部分,但不提倡,11.3 类和对象的定义(2/12),成员函数 作用响应发送给类的对象的消息 可以放在public部分(可以被外部函数调用),也可以是私有的(供自己的成员函数使用) 成员函数的实现一般放在类的外面,并且与类的定义不在一个文件中(也可以在类的里面) 除了极短的函数以外,建议类的所有成员函数的实现都放在类的外面,11.3 类和对象的定义(3/

15、12),访问控制 三个访问说明符:public、private和protected 作用控制对类的成员的访问 在用class定义的类中,默认的访问方式是private 在类的定义中,三个访问说明符都可以使用多次(不提倡),11.3 类和对象的定义(4/12),访问控制 类的私有成员只能被类的成员函数、友元访问 类的受保护成员能被类的成员函数、友元和派生类成员函数访问 类的公有成员可以被类的成员函数、友元以及所有能访问到类的对象的外部程序代码直接访问 类的公有成员是类的对外接口,11.3 类和对象的定义(5/12),最低访问权原则 如果某函数不需要访问某些数据,则不给它访问的权限(如外部函数与类

16、的私有属性) 如果某函数需要读取某数据的值,但不需要修改它,则只给它读的权限(如函数的const参数) 只有当函数需要修改某数据时才给它全部的访问权限 对于类的数据成员,即使外部函数需要修改它,一般也只给它提供公有函数接口,让它通过类的公有成员函数访问类的私有数据,11.3 类和对象的定义(6/12),静态成员 类的对象独立拥有自己的数据成员空间,共享类的成员函数 对象之间相互独立,消息是对象之间交互的唯一方式 如果一个类的不同对象需要共享数据,怎么办? 如果要知道一个类是否有对象存在,怎么办?,11.3 类和对象的定义(7/12),静态成员 类的静态成员包括静态数据成员和静态成员函数 类的静态数据成员属于类,被类的所有对象共享 静态成员的声明方式: static + 数据或函数定义 类的静态成员可以是

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

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

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