《数据结构与算法设计》第一部分 面向对象的C++程序设计基础
面向对象程序设计语言是抽象类数据的理想描 述工具 面向对象程序设计语言是抽象类数据的理想描 述工具 C语言程序设计是面向对象的C++程序设计的 先修课程 C语言是一种支持面向过程的结构化程序设计语言 面向过程的结构化程序设计在程序设计方法发 展历程中具有重要的作用
面向过程的结构化程序设计 设计思路 程序结构: 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 按功能划分为若干个基本模块,形成一个树状结构。 各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。 其模块化实现的具体方法是使用子程序。
面向过程的结构化程序设计 优点: 有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
面向过程的结构化程序设计 缺点: 可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 每一种相对于老问题的新方法都要带来额外的开销。 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。
面向对象的程序设计方法 将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。 对同类型对象抽象出其共性,形成类。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。
面向对象的程序设计方法 优点: 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。
面向对象的C++程序设计基础 第 1 章 面向对象的设计方法 面向对象的基本概念和基本特性 C++的初步知识
本章知识点 面向对象的基本概念和基本特性 C++的初步知识
面向对象的思想 “面向对象”是软件设计的一种新思想,旨在使人们分析、设计系统的方法更接近认识系统的方法; 面向对象方法就是为计算机软件的创建提出了一种模型化世界的抽象方法; 软件工程专家给出了面向对象的描述: 面向对象 = 对象 + 分类 + 继承 + 消息通信 即面向对象就是使用对象、类、继承等机制,对象之间仅能通过消息的传递实现通信。
面向对象的基本概念 ——对象 一般意义上的对象: 现实世界中一个实际存在的事物。 面向对象的基本概念 ——对象 一般意义上的对象: 现实世界中一个实际存在的事物。 可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划)。 构成世界的一个独立单位,具有: 静态特征:可以用某种数据来描述 动态特征:对象所表现的行为或具有的功能
现实世界中的对象 面向对象的基本概念 对象是现实世界的一个实体,它具有如下特征: 1、有一个名字以区别于其他对象; 2、有一个状态用来描述它的某些特征; 3、有一组操作,每一个操作决定了对象的一种功能或行为; 对象的操作分为两类:1)自身所承受的操作。2)是它施加于其它对象的操作。(例如人可以接受知识,人可以驾驶汽车) 面向对象的基本概念
面向对象的基本概念 ——对象 面向对象方法中的对象: 面向对象的基本概念 ——对象 面向对象方法中的对象: 系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。
计算机世界中的对象 面向对象的基本概念 在计算机世界中,可以把对象看成是存储器中一个可标识的区域,它能保存固定或可变数目的数值(或数值的集合),这些数值代表对象的属性数据和对象的成员函数代码。 从软件形式上看,对象是系统程序员、应用程序员或用户所定义的抽象数据类型的变量。
对象的状态 面向对象的基本概念 对象的状态指对象自身所具有的那些特征(属性); 这些状态的存在,使对象能对自身以及对外界对象施加操作; 对象的状态并不是完全用来直接为外界服务的,但它们本身是能够为外界服务的基础。
对象的特性 面向对象的基本概念 模块独立性 对象是独立存在的模块,封装了数据和操作。外部使用时只需了解它具有哪些功能。模块间的依赖性极小或几乎没有。 动态连接性 对象之间有联系,通过消息激活机制,把一个个对象动态地连接在一起。 易维护性 对象修改、功能完善及实现的细节都被局限于对象的内部,不会涉及到外部。
面向对象的基本概念 ——类 分类——人类通常的思维方法 分类所依据的原则——抽象 面向对象的基本概念 ——类 分类——人类通常的思维方法 分类所依据的原则——抽象 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念。
面向对象的基本概念 ——类 面向对象方法中的"类" 具有相同属性和服务的一组对象的集合 面向对象的基本概念 ——类 面向对象方法中的"类" 具有相同属性和服务的一组对象的集合 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 类与对象的关系: 犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。
类与对象的关系 面向对象的基本概念 类(模板)与对象(实例)的关系是抽象与具体的关系; 同一类的不同实例之间,必有如下特点: 相同的操作集合; 相同的属性集合; 不同的对象名。
类的确定与描述 面向对象的基本概念 类的确定采用归纳法,基于对所遇到对象的总体分析中,归纳出其共同的特征来定义类; 类是数据和对这些数据进行操作的函数的封装体,它是一种同时含有数据和函数的构造数据类型(结构); 类的描述同时包括数据和函数定义,类中的数据和函数称为类的成员(数据成员、成员函数); 数据成员是类的那些成员函数需要用到的变量,成员函数是对数据成员进行处理的程序段。 面向对象的基本概念
面向对象的基本特性 ——封装性 把对象的属性和服务结合成一个独立的系统单元。 面向对象的基本特性 ——封装性 把对象的属性和服务结合成一个独立的系统单元。 尽可能隐蔽对象的内部细节。对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。
什么是封装性? 面向对象的基本特性 在面向对象中,封装是将一段程序代码“包装”起来,只需知道这段“代码”完成的功能,而不必关心功能的实现细节; “代码”包括一组数据和与这组数据相关的操作; 封装是指将一组数据(对象属性)和与这组数据相关的操作(对象服务)集合在一起,形成一个不可分割、独立的实体—对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部接口访问对象的服务。
封装应该具有以下几个条件: 面向对象的基本特性 1. 有一个清楚的边界,对象的所有私有数据、内部程序(成员函数)细节都被限定在这个边界内; 1. 有一个清楚的边界,对象的所有私有数据、内部程序(成员函数)细节都被限定在这个边界内; 2. 至少有一个接口,这个接口描述了该与其它对象之间的相互作用、请求和响应,它就是消息; 3. 对象行为的内部实现代码受封装壳的保护,其他对象不能直接修改该对象所拥有的数据和相关程序代码。
面向对象系统的封装性 面向对象的基本特性 面向对象系统的封装性是一种信息隐藏技术。它的目的在于将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节; 封装机制提供了一种共享代码的手段。通过封装,把一段代码定义在一个类中,并且在另一个类所定义的操作中,可以通过创建该类的实例,并向它发送消息而启动这段程序代码,达到共享代码的目的。
面向对象的基本特性 ——继承性 继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 面向对象的基本特性 ——继承性 继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。 例如:将轮船作为一个一般类,客轮便是一个特殊类。
继承的含义 面向对象的基本特性 1、继承表达了对象之间的相交关系,即某类对象可以继承另一类对象的特征和能力。具有继承关系的类有如下特征: ☆ 类间具有共享特征(包括数据和程序代码共享); ☆ 类间具有细微的差别或新增部分(包括非共享的程序代码和数据); ☆ 类间具有层次结构(包含关系)。 2、继承的作用: 在定义子类时不必重复在父类中定义的数据和操作,可减少代码冗余,提高软件复用性; 增强一致性,减少模块之间的接口和界面,易于程序维护。 面向对象的基本特性 在对现世界建立系统模型时,可根据事物的的共性抽象出一批基本的对象类(称为基类),在此基础上再根据事物的个性抽象出新的对象类,它们既有基类的全部属性和功能,又有自己独特的属性和功能。这些新的对象类称为父类的子类(派生类)。基类也称父类。继承是指子类可以自动共享父类的全部属性和功能,继承描述了父类与子类之间的相交关系。
继承的分类 面向对象的基本特性 单继承:一个类只允许有一个父类时,这种类的继承为单继承; 从继承源上可划分为单继承和多继承; 单继承:一个类只允许有一个父类时,这种类的继承为单继承; 多继承:一个类同时允许有2个以上的父类时,这种类的继承为多继承。
单继承与多继承 F E D C B A A B C D E 多继承 单继承
面向对象系统的继承性 能清晰体现相关类之间的层次结构关系; 能减小代码和数据的冗余度,增加程序重用性; 能通过增强一致性来减少模块间的接口和界面,增加程序的易维护性; 继承是能自动传播代码的有力工具; 继承还是在一些比较一般的类的基础上进行构造、建立和扩充新类的最有效的手段,利于软件设计的逐步细化,即先进行公共特性的设计,再自顶向下开发子类,逐步加入新内容。
面向对象的基本特性 ——多态性 多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。 例如: 数的加法->实数的加法 ->复数的加法
多态性的含义 面向对象的基本特性 多态性(Polymorphism)是指同一名字(函数、运算符)在不同的场合具有不同的语义,或者同一界面有多种实现; C++中的多态性是指不同的对象收到相同的消息时产生不同的动作或行为; C++支持两种多态性: 1、编译时的多态性:通过函数重载来实现。 2、运行时的多态性:通过虚函数来实现。
重载(Overloading) C++允许为已有的函数和运算符重新赋予新的含义,即具有相同名字的函数和运算符在不同的场合可以表现为不同的行为; 重载的含义是指通过为函数和运算符创建附加定义而使它们的名字重载,即相同名字的函数或运算符在不同的场合可以表现出不同的功能; 函数重载:同一个作用域内若干个参数特征不同的函数可以使用相同的名字,定义重载函数时,函数名相同,函数参数类型、个数、顺序必须不同; 运算符重载:同一个运算符可以施加在两个任意类型的操作数(例如结构变量或对象)上。
本知识点总结 回顾了面向过程程序设计思想; 介绍了面向对象的思想; 介绍了面向对象的基本概念: 对象和类; 重点讲述了面向对象的基本特性:封装性的特点,继承性的优点和多态性的含义。
C++的初步知识 ——C++语言的产生 C++是从C语言发展演变而来的,首先是一个更好的C 引入了类的机制,最初的C++被称为“带类的C” 于1994年制定了ANSI C++标准草案 于1998年11月被国际标准化组织(ISO)批准为国际标准,成为目前的C++
C++的初步知识 ——C++的特点 全面兼容C 支持面向对象的方法 它保持了C的简洁、高效和接近汇编语言等特点
C++(C plus plus)是C语言的超集,完全兼容C语言,但在概念上不同于C,应按C++自己的方式来使用它,掌握C++的思维方式、程序设计方法和编程习惯。那么,C++对C做了哪些修改和增强?
从C到C++ C++的初步知识 函数原形说明 变量的说明 输入输出 const说明符 void类型
函数原形说明 C++的初步知识 void display (int, char *, float); 在函数定义和声明时,必须提供全部信息: void display (int, char *, float); int mixture (int, float, char *);
变量的说明 C++的初步知识 在C中,变量的定义必须出现在函数或复合语句的最前面,在正常执行语句后面不能再定义变量。 int m,n,k; m=10;n=9; k=m*n; …. 在C++中,变量的定义可以出现在任何位置。 int m,n,k; m=10;n=9; k=m*n; …. int x,y; y=k+m; …
输入和输出 C++中除了保留C标准库中的各种输入和输出函数外,还提供了一套新的输入和输出函数—流式输入输出。使用时包含头文件“iostream.h”。 例: #include <iostream.h> void main( ) { int x,y; float z; cin>>x>>y>>z; //从标准终端输入数据 char *str=“Hello, how are you!”; cout<<“Please output the info of the string:”<<str<<“\n”; //向屏幕输出字符串}
const说明符 C++的初步知识 定义常量时,C语言用#define,而C++用const说明符,const在C++中的作用: 例:#define MAX 100 可替代为: const int MAX=100; 或 int const MAX=100; 2. 定义常量数组 const float data[ ]={1.2,2.5,3.6,4.8,5.5};
const说明符 C++的初步知识 例:void print_value(const int value) { cout<<value; } 试图在该函数体中改变const参量value的是非法的。
const说明符 C++的初步知识 4. 定义指针常量,根据const位置的不同含义也不同,有三种方式: (1) 指向常量的指针:说明一个指针变量指向的数据是常量。(name是指向字符串常量的指针,name指向的字符串不能更改,但name可以更新) const char *name=“Richard”; name=“Martin”; 对 name[0]=‘C’; 错
const说明符 (2) 常指针: 把指针本身声明为一个常量,而不是将它指向的对象声明为常量。(name不能更改,name指向的内容可更新 ) char *const name=“Richard”; name=“Martin”; 错 name[0]=‘C’; 对 (3) 指向常量的常指针: 这个指针本身不能改变,它指向的值也不能改变。(name不能更改,name指向的内容也不能更新 ) const char *const name=“Richard”; name=“Martin”; 错 name[0]=‘C’; 错
void类型 C++的初步知识 void是指没有数值的数据类型,没有任何返回值的函数应说明为void类型。 例如: void fun ( int * ); void也可表示一个函数不需要任何入口参数。 例如: int graph (void); 将C程序转换成与C++兼容的最常见的工作就是将没有返回值的函数说明为void类型。C++严格检查所有的函数原型是否包括:返回值类型、函数名和各个参数的类型。
最简单的C++程序 例1.4.1 输出一行字符:“This is a C++ program.” 程序如下: #include <iostream.h> //用cout输出时需要用此头文件 int main() { cout <<“This is a C++ program.\n”; //用C++的 //方法输出一行信息 return 0; } 程序运行时输出: This is a C++ program.
最简单的C++程序 例1.4.2 求a、b两个数之和。 //求两个数之和 (本行是注释) //求两个数之和 (本行是注释) #include <iostream .h> //用cout输出时需要用此头文件 int main() //主函数首部 { int a,b,sum; //变量说明 cin >> a >> b; //输入语句 sum = a + b; cout <<“a + b =”<< sum << endl; //输出语句 return 0; }
C++程序的书写格式 一个C++程序可以由一个程序单位或多个程序单位构成。每一个程序单位作为一个文件,每个文件由若干个函数组成。由函数构成的C++程序中,必须只有一个主函数main( ),它是程序执行的入口。 需要指出两点: 1、C++函数(包括main)的定义和声明,必须提供函数的全部信息:返回值、函数参数类型和个数。无返回值或无参的情况用void; 2、注释形式: 在一行语句内,“//”后面的字符被视为注释 在多行语句内,“/*”和“*/”中间的所有字符被视为注释。
C++程序的编写和实现 用C++语言编写源程序*.cpp; 对源程序进行编译,形成 *.obj文件。如果编译出错,再修改源程序,直到编译正确; 将目标文件与C++编译器提供的库文件进行连接,形成可执行的二进制文件 *.exe; 运行程序; 分析运行结果。
本知识点总结 主要介绍了C++比C增强的知识,包括:函数原型与变量说明、输入输出、const说明符和void类型。
本章小结 熟悉面向对象的思想; 理解面向对象的基本概念: 对象和类; 掌握面向对象的基本特性:封装性的特点,继承性的优点和多态性的含义; 掌握C++比C增强的知识:函数原型与变量说明、输入输出、const说明符和void类型。