1、测绘程序设计与测绘程序设计与C+编程编程长安大学长安大学 杨建华杨建华2012年年8月月第一章第一章 绪绪 论论第一节第一节 本课程的研究内容本课程的研究内容测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都可以使用计算机来完成。本课程主要讲述以下内容:可以使用计算机来完成。本课程主要讲述以下内容:(1) 面向对象软件设计的思想与面向对象软件设计的思想与C+语言。语言。(2) 测绘数据处理常用工具类设计。矩阵的概念及其相关计算,角测绘数据处理常用工具类设计。矩阵的概念及其相关计算,角度度-弧度互化的函数、测量正反算函数以及正态分
2、位数函数。弧度互化的函数、测量正反算函数以及正态分位数函数。 (3) 基本平差程类基本平差程类adj设计。最小二乘平差与抗差估计。设计。最小二乘平差与抗差估计。(4) 高程网平差类设计。水准网、三角高程网平差的相关计算问题。高程网平差类设计。水准网、三角高程网平差的相关计算问题。(5) 平面网平差类设计。三角网、边角网、测边网平差的相关计算平面网平差类设计。三角网、边角网、测边网平差的相关计算问题。问题。(6) GPS向量网平差类设计。观测值为向量网平差类设计。观测值为GPS基线向量网的三维坐标基线向量网的三维坐标平差。平差。(7) 测量坐标系转化类设计。测量坐标系转化程序设计技术,主要测量坐
3、标系转化类设计。测量坐标系转化程序设计技术,主要包括空间直角坐标系与大地地理坐标系的转换、高斯投影转换与平包括空间直角坐标系与大地地理坐标系的转换、高斯投影转换与平面直角坐标系的转换程序。面直角坐标系的转换程序。(8) 综合应用类设计。建立一个综合应用类,封装以上七个数据处综合应用类设计。建立一个综合应用类,封装以上七个数据处理功能,为用户的具体问题计算应用提供方便。理功能,为用户的具体问题计算应用提供方便。平差问题程序计算特点平差问题程序计算特点 平差程序计算:速度快、精度高、数据处理自动化;平差程序计算:速度快、精度高、数据处理自动化;从程序设计的角度看,程序设计与平差计算从程序设计的角度
4、看,程序设计与平差计算相对独立相对独立。在程序设计时必须考虑需要处理的所有问题的普遍性和在程序设计时必须考虑需要处理的所有问题的普遍性和规律性。规律性。在程序计算时,选择平差方法的依据不同:在程序计算时,选择平差方法的依据不同:在在手工计算手工计算时,我们通常希望尽量时,我们通常希望尽量降低计算工作量降低计算工作量。当。当 必要观测数必要观测数 t 多余观测数多余观测数 r:条件平差;:条件平差; 必要观测数必要观测数 t结构化程序设计(结构化程序设计(C) 按组成结构分块按组成结构分块=面向对象程序设计面向对象程序设计 (C+) 模块的功能用的其他模块),引用的全局变量,调模块接口(输入、输
5、出外部特征序代码实现模块具体功能的程模块的局部数据内部特征模块的性质 结构化方法(结构化方法(C语言)语言) 功能分解:大事化小(将复杂的功能结构分解为一系列小功能分解:大事化小(将复杂的功能结构分解为一系列小的、相对独立、简单的局部功能结构)的、相对独立、简单的局部功能结构) 按功能划分模块,要求每个模块包含单一、具体的功按功能划分模块,要求每个模块包含单一、具体的功能能 使每个模块独立性好,要求一个模块具有较强的内聚使每个模块独立性好,要求一个模块具有较强的内聚性和较弱的耦合性。方便于模块的独立开发、调试,性和较弱的耦合性。方便于模块的独立开发、调试,同时,使模块具有很好的移植性。同时,使
6、模块具有很好的移植性。 划分模块时,应当尽量减小模块间的耦合性,例如尽可能划分模块时,应当尽量减小模块间的耦合性,例如尽可能地使用局部变量就可以减小模块之间的耦合性。采用层次地使用局部变量就可以减小模块之间的耦合性。采用层次结构进行分析结构进行分析(方法方法): 最上层模块是对系统整体功能的抽象;最上层模块是对系统整体功能的抽象; 下层模块是对上层模块的逐步细化、分解、描述;下层模块是对上层模块的逐步细化、分解、描述; 重复(重复(2),得出便于实现的独立性好的模块,直到下),得出便于实现的独立性好的模块,直到下层模块不可再分为止。在最下层,对层模块不可再分为止。在最下层,对“怎么做怎么做”作
7、出作出精确的描述。精确的描述。 平差程序结构化分块方法平差程序结构化分块方法 面向对象方法(面向对象方法(C+语言)语言) 结构化方法的缺陷:结构化方法的缺陷: 1)基于功能分块的设计方法。)基于功能分块的设计方法。 2)对数据与处理方法的分离与割裂。)对数据与处理方法的分离与割裂。 3)可重用性差。)可重用性差。 面向对象方法的基本思想:面向对象方法的基本思想: 面向对象方法直接分析现实世界或问题空间的概念组面向对象方法直接分析现实世界或问题空间的概念组成结构,使用这些成结构,使用这些概念概念将需要研究的大问题将需要研究的大问题划分划分成一系列成一系列独立的小问题。独立的小问题。 在问题分析
8、与软件设计时,与结构化设计方法的最大在问题分析与软件设计时,与结构化设计方法的最大区别是区别是结构化按照功能独立性要求进行功能模块划分结构化按照功能独立性要求进行功能模块划分;面面向对象方法使用概念对数据与功能进行整体划分向对象方法使用概念对数据与功能进行整体划分,其模块,其模块化程度更完整、独立性更好。化程度更完整、独立性更好。 面向对象以客观世界固有的事物面向对象以客观世界固有的事物(对象对象)为基本单位来构造软为基本单位来构造软件系统,用人类一般的的思维方法来认识、理解和描述客观件系统,用人类一般的的思维方法来认识、理解和描述客观事物(软件系统),其思想本质是直接事物(软件系统),其思想
9、本质是直接模拟现实模拟现实问题空间的问题空间的事物组成结构及其运行与功能关系。事物组成结构及其运行与功能关系。 对象对象=数据数据+算法(程序?)算法(程序?) 程序程序=对象对象1+对象对象2+. 对象是一个包含数据与算法的相对独立的封闭系统,其内部对象是一个包含数据与算法的相对独立的封闭系统,其内部结构特征为表示对象属性的数据和表示行为与功能的函数结结构特征为表示对象属性的数据和表示行为与功能的函数结构,构,对象内部的数据与功能是密不可分的对象内部的数据与功能是密不可分的。对象本身是一个。对象本身是一个独立的数据与功能单元,也就是说,一个独立的数据与功能单元,也就是说,一个对象就是一个(小
10、)对象就是一个(小)的软件系统的软件系统。 面向对象的思想是将客观事物看作具有属性和行为的对象;面向对象的思想是将客观事物看作具有属性和行为的对象;将问题分解为不同的对象,一个复杂对象由若干个简单对象将问题分解为不同的对象,一个复杂对象由若干个简单对象构成。通过消息实现对象之间的联系,构造复杂系统;通过构成。通过消息实现对象之间的联系,构造复杂系统;通过抽象找出同一类对象的共同属性和行为,形成类;通过类的抽象找出同一类对象的共同属性和行为,形成类;通过类的继承与多态实现代码重用。继承与多态实现代码重用。 第三节第三节 面向对象程序设计面向对象程序设计 面向对象的基本概念面向对象的基本概念 类类
11、 分类分类把具有共同性质的事物划分为一类,得出一个抽把具有共同性质的事物划分为一类,得出一个抽象的象的概念概念。 面向对象的类面向对象的类对具有相同属性和行为的一组对象集合对具有相同属性和行为的一组对象集合的描述。的描述。 类之间的关系类之间的关系 一般与特殊:某个类的对象同时是另一个类的对象,如动一般与特殊:某个类的对象同时是另一个类的对象,如动物类与人类,鸟类与丹顶鹤类。物类与人类,鸟类与丹顶鹤类。 整体与局部:一个实体的物理构成,空间上的包容及组织整体与局部:一个实体的物理构成,空间上的包容及组织机构等。机构等。 关联:两个类的对象实例之间具有某种依赖关系,如某人关联:两个类的对象实例之
12、间具有某种依赖关系,如某人为某个公司工作,教师指导学生论文,某人拥有汽车。为某个公司工作,教师指导学生论文,某人拥有汽车。 l 封装封装 (对象)(对象)封装是把一组数据和与其有关的操作集合封装是把一组数据和与其有关的操作集合组装在一起,形成一个能动的实体。封装的目的是增强安组装在一起,形成一个能动的实体。封装的目的是增强安全性和控制用户操作。用户不必了解对象内部具体的实现全性和控制用户操作。用户不必了解对象内部具体的实现细节,只需要通过外部接口来使用对象的成员。如:生活细节,只需要通过外部接口来使用对象的成员。如:生活中的封装实体中的封装实体集成电路;面向对象中的封装实体集成电路;面向对象中
13、的封装实体对象。对象。l 继承(类)继承(类)保持已有类的特性而构造新类的过程称为继承。保持已有类的特性而构造新类的过程称为继承。特殊类拥有其一般类的全部属性与服务,称作特殊类对一特殊类拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:如船与轮船;丹顶鹤与鸟类。般类的继承。例如:如船与轮船;丹顶鹤与鸟类。 当一个类拥有另一个类的所有数据和操作时,就称这两个当一个类拥有另一个类的所有数据和操作时,就称这两个类之间存在着继承关系。类之间存在着继承关系。 父类:被继承的已有类称为父类、基类。父类:被继承的已有类称为父类、基类。 子类:继承了父类的所有数据和操作的类就为子类、派生子类:继承
14、了父类的所有数据和操作的类就为子类、派生类。类。 单继承:一个类只有一个父类。单继承:一个类只有一个父类。 多继承:一个类有多个父类。多继承:一个类有多个父类。l 派生(类)派生(类)在已有类的基础上新增自己的特性而产生新类在已有类的基础上新增自己的特性而产生新类的过程称为派生。派生出的新类称为派生类。派生的目的:的过程称为派生。派生出的新类称为派生类。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造(时,需要对原有程序进行改造(增加成员增加成员)。)。 l 消息(对象间)消息(对象间)消息是对象之间建立
15、联系的通信机制。提消息是对象之间建立联系的通信机制。提供服务的对象负责消息协议的格式和消息的接收,请求服供服务的对象负责消息协议的格式和消息的接收,请求服务的对象提供输入信息,获取应答消息内容。消息的使用务的对象提供输入信息,获取应答消息内容。消息的使用类似于函数调用。类似于函数调用。l 多态性多态性:同样的消息被不同的对象接受所导致不同的行:同样的消息被不同的对象接受所导致不同的行为为 。多态意味着可以关联不同的实例对象,从而产生不。多态意味着可以关联不同的实例对象,从而产生不同的行为,在面向对象的软件技术中,多态性也可以理解同的行为,在面向对象的软件技术中,多态性也可以理解为不同的对象可以
16、调用相同名称的函数,导致完全不同的为不同的对象可以调用相同名称的函数,导致完全不同的行为的现象。行为的现象。 增加了面向对象软件系统的灵活性,进一步减少了信息冗增加了面向对象软件系统的灵活性,进一步减少了信息冗余,提高了软件的可重用性和可扩充性余,提高了软件的可重用性和可扩充性 。 l 面向对象方法特点面向对象方法特点 1)与人类习惯的思维方法一致)与人类习惯的思维方法一致 面向对象的设计方法使用现实世界的概念思考问题。它强面向对象的设计方法使用现实世界的概念思考问题。它强调模拟现实世界中的概念而不强调算法。调模拟现实世界中的概念而不强调算法。 2)稳定性好)稳定性好 现实世界中的实体是相对稳
17、定的,因此以对象为中心构造现实世界中的实体是相对稳定的,因此以对象为中心构造的软件系统也是比较稳定的。的软件系统也是比较稳定的。 面向对象软件系统的结构是根据问题领域的模型建立起来面向对象软件系统的结构是根据问题领域的模型建立起来的,而不是根据系统应完成的功能的分解建立的。因此当的,而不是根据系统应完成的功能的分解建立的。因此当系统功能需求变化时,不会引起软件结构的整体变化。系统功能需求变化时,不会引起软件结构的整体变化。 3)可重用性好)可重用性好 软件重用定义:软件重用是指在不同的软件开发过程中重软件重用定义:软件重用是指在不同的软件开发过程中重复使用相同或相似软件元素的过程。复使用相同或
18、相似软件元素的过程。 传统软件重用技术:利用标准函数库。但难以适应不同场传统软件重用技术:利用标准函数库。但难以适应不同场合的不同需要,通常绝大多数函数都是新编的。合的不同需要,通常绝大多数函数都是新编的。 4)易于开发大型软件产品)易于开发大型软件产品 软件成本降低,整体质量提高。软件成本降低,整体质量提高。 第四节第四节 测绘数据处理程序设计测绘数据处理程序设计 第五节第五节 VC+6.0程序开发环境程序开发环境 Visual C+是微软使用是微软使用C+语言的语言的Windows程序程序开发平台,该平台支持程序程序开发平台,该平台支持C+控制台程序开发(控制台程序开发(dos以以main
19、()函()函数为程序主要入口)要求。数为程序主要入口)要求。C+兼容兼容C,所,所以也可以用来设计以也可以用来设计C语言的结构化程序。本语言的结构化程序。本课程采用课程采用Visual C+6.0作为程序开发平台。作为程序开发平台。 Visual C+6.0是是Windows程序,以菜单定程序,以菜单定义相关操作功能,应用方便。其桌面布局义相关操作功能,应用方便。其桌面布局(图(图1):): 客户区是代码输入、编辑区,在该区域输客户区是代码输入、编辑区,在该区域输入、编辑入、编辑C/C+程序源代码;程序源代码; 图1 Visual C+6.0 开发环境 工作区是工作区是VC+程序开发管理区,在
20、此系统列出软程序开发管理区,在此系统列出软件相关的文件、件相关的文件、Windows资源、相关函数、变量、资源、相关函数、变量、类等结构。在控制台程序设计中,主要用来管理类等结构。在控制台程序设计中,主要用来管理相关结构、函数、定义的全局变量等。相关结构、函数、定义的全局变量等。 输出区主要显示程序的编译、连接、调试等的输出区主要显示程序的编译、连接、调试等的结果或数据。在控制台程序开发中,主要用于编结果或数据。在控制台程序开发中,主要用于编译结果显示,在此查看程序编译错误。译结果显示,在此查看程序编译错误。 *程序运行时,弹出程序运行时,弹出Windows运行窗口(图运行窗口(图2),),默
21、认条件下,背景为黑色,文字为白色。文字可默认条件下,背景为黑色,文字为白色。文字可浏览、不可编辑。在此可以以键盘输入程序数据。浏览、不可编辑。在此可以以键盘输入程序数据。运行完毕,点击任意键关闭此窗口。运行完毕,点击任意键关闭此窗口。 以下在说明以下在说明Visual C+6.0环境下,开发环境下,开发Dos程序程序的主要过程:的主要过程: 图图 2 程序运行窗口程序运行窗口 1选择选择“新建新建”,在弹出的,在弹出的“新建新建”窗口下点击窗口下点击“文件文件”,弹出,弹出窗口:窗口:2. 代码输入、编辑与编译连接代码输入、编辑与编译连接3.程序运行程序运行4.打开已有文件或工作区打开已有文件
22、或工作区 如上图所示,点击文件菜单下如上图所示,点击文件菜单下“打开打开”选选项,可以打开项,可以打开.Cpp、.h等文件,也可以通等文件,也可以通过文件类型选择打开其他文件(例如过文件类型选择打开其他文件(例如.txt文文件)。件)。 点击文件菜单下点击文件菜单下“打开打开 工作区工作区”选项,可选项,可以打开以打开.dsw文件,打开一个工作区文件,文件,打开一个工作区文件,则已编译、连接的所有文件都会打开,包则已编译、连接的所有文件都会打开,包括已有的括已有的.exe文件。所以,可以直接运行文件。所以,可以直接运行该程序;也可以重新编辑源代码,再编译、该程序;也可以重新编辑源代码,再编译、
23、运行。运行。 例:例:第二章第二章 C+语言新技术语言新技术 2-1 函数重载函数重载函数重载函数重载在在C语言中,为定义不同类型数据相加的操作,必须使语言中,为定义不同类型数据相加的操作,必须使用不同的函数名来定义一组函数。用不同的函数名来定义一组函数。Iplus() 整数相加;整数相加;Dplus() 实数相加;实数相加;Fplus() 浮点数相加;浮点数相加;Cplus() 字符串相加。字符串相加。在在C+语言中,可以使用更简洁的方法处理这种问题。语言中,可以使用更简洁的方法处理这种问题。对以上四种计算可以只使用一个函数名对以上四种计算可以只使用一个函数名plus定义相关的定义相关的不同
24、函数。计算机函数编译的区别标志在于不同函数。计算机函数编译的区别标志在于函数的参数函数的参数不同不同。在应用时,就可以以一个相同的函数名调用一族。在应用时,就可以以一个相同的函数名调用一族函数。这就是函数。这就是C+语言函数重载的概念。语言函数重载的概念。使用一个已经存在的函数名定义一个新函数叫对原有使用一个已经存在的函数名定义一个新函数叫对原有函函数的重载数的重载。 定义重载函数的关键在于同名函数应当具有定义重载函数的关键在于同名函数应当具有不同的参数不同的参数。参数不同:函数参数的参数不同:函数参数的类型不同类型不同或函数参数的或函数参数的个数不同个数不同。 对于上例问题,可以定义一组重载
25、函数对于上例问题,可以定义一组重载函数(函数定义略函数定义略): int plus(int a, int b); double plus(double a, double b); float plus(float a, float b); char* plus(char * a, char* b); 在应用时,系统根据参数的不同关联相关函数,如:在应用时,系统根据参数的不同关联相关函数,如: int d=plus(2,14); coutplus(3.12, 5.899)endl; float s=plus(4.45 f, 5.66 f); 重载的使用使程序的编写与使用具有方便性。应当注意的重载
26、的使用使程序的编写与使用具有方便性。应当注意的是,对于在操作和概念上不具有相似性的函数尽量不要使是,对于在操作和概念上不具有相似性的函数尽量不要使用重载,以免引起使用者的误解。用重载,以免引起使用者的误解。 运算符重载运算符重载 :C+运算符可以处理基本类运算符可以处理基本类型数据的计算问题,但不能用于用户定义型数据的计算问题,但不能用于用户定义的新类型(类)数据的计算。的新类型(类)数据的计算。 如果需要为用户定义的新类型定义运算符如果需要为用户定义的新类型定义运算符操作功能,可以使用运算符函数对已有运操作功能,可以使用运算符函数对已有运算符定义新功能。这种新功能定义叫算符定义新功能。这种新
27、功能定义叫运算运算符重载符重载。 运算符函数格式:运算符函数格式: 返回值返回值 operator 操作符(参数表);操作符(参数表); 对类类型数据的运算符重载可以使用友元对类类型数据的运算符重载可以使用友元函数与成员函数两种形式进行定义。在后函数与成员函数两种形式进行定义。在后面讲。面讲。1、引用的概念、引用的概念 是是C+区别于区别于C的另一个技术特征。引用的作用在的另一个技术特征。引用的作用在于函数的参数传递,使用引用,可以以变量名直于函数的参数传递,使用引用,可以以变量名直接实现函数参数的接实现函数参数的双向传递双向传递。 那什么是引用呢?简单地说,那什么是引用呢?简单地说,引用是对
28、一个引用是对一个取的别名取的别名,也就是给一个变量取的第二个名字。,也就是给一个变量取的第二个名字。常量不可以建立引用。例如:常量不可以建立引用。例如: int i; int & j=i; 这里,这里,i是一个变量,定义是一个变量,定义j为为i的引用。系统不再的引用。系统不再为为j分配存储空间,而让分配存储空间,而让j与与i使用相同的存储空间使用相同的存储空间。这时,在程序中任何对这时,在程序中任何对j的访问就是对的访问就是对i的访问。的访问。 引用的最主要作用在于函数参数的传递,也就是引用的最主要作用在于函数参数的传递,也就是定义函数的参数为引用类型。定义函数的参数为引用类型。2-2 引引
29、用用int Plus(int & x, int & y) / x,y为函数调用时对应实参的引用为函数调用时对应实参的引用 x+; y+; return x+y;通过下面的例子可以看到引用的使用结果:通过下面的例子可以看到引用的使用结果:#includevoid main() Int a(5),b(10),c; c=plus(a,b); couta“,”b “,”cendl;该程序运行结果为该程序运行结果为6,11,17在该程序中,我们发现,在该程序中,我们发现,形参的改变导致了实参的改变形参的改变导致了实参的改变。原因在于函。原因在于函数中定义的函数形参为实参的引用。这种作用在程序设计中具有很
30、强数中定义的函数形参为实参的引用。这种作用在程序设计中具有很强的应用价值。的应用价值。 C语言使用标准输入语言使用标准输入/输出库输出库函数函数完成数据的输入与输出,在使用中,需要完成数据的输入与输出,在使用中,需要判断数据类型,应用不方便。判断数据类型,应用不方便。C+使用面使用面向对象的方法实现数据的输入向对象的方法实现数据的输入/输出,使用输出,使用上更灵活、简便。上更灵活、简便。 C+使用输入输出流使用输入输出流定义数定义数据的键盘输入与屏幕输出,并预定义了两据的键盘输入与屏幕输出,并预定义了两个应用对象个应用对象cin和和cout,cin用来实现数据用来实现数据的键盘输入;的键盘输入
31、;cout用来实现数据的屏幕输用来实现数据的屏幕输出,并为这两个对象分别定义了运算符出,并为这两个对象分别定义了运算符和和。在程序设计中,我们可以直接使用。在程序设计中,我们可以直接使用这两个对象及其运算符来完成相关操作。这两个对象及其运算符来完成相关操作。分析如下程序:分析如下程序:2-3 输入输入/输出流输出流 #include void main() int a,b,c; double d,e,f; char name20; cout”please input a,b ”ab; cout”please input d,e ”de; cout”please input name ”name
32、; c=a+b; f=d+e; cout“ name is ”nameendl; cout”c=”cendl; cout”f=”fendl; 程序中,程序中,endl是输出换行符(是输出换行符(end-line)。)。 运行程序:运行程序: please input a,b 3 4 please input d,e4.3 3.4 please input name 杨建华杨建华 运行结果:运行结果: name is 杨建华杨建华 c=7 f=7.7 由程序可以看出,使用输入输出流在程序设计中处理数据由程序可以看出,使用输入输出流在程序设计中处理数据的输入与输出的方便性。的输入与输出的方便性。
33、文件流文件流 文件流是文件流是C+以面向对象的方法定义的以面向对象的方法定义的文件格式文件格式的数据输入的数据输入/输出方法。在需要处理大数据量时使输出方法。在需要处理大数据量时使用文件管理数据是非常必要的。从而也可以使数用文件管理数据是非常必要的。从而也可以使数据处理的结果以文件形式被永久保存。据处理的结果以文件形式被永久保存。 C+有三种文件流:有三种文件流: 输入文件流输入文件流 ifstream ,用来处理由文件的数据输,用来处理由文件的数据输入;入; 输出文件流输出文件流 ofstream ,用来处理向文件的数据,用来处理向文件的数据输出;输出; 输入输入/输出文件流输出文件流fst
34、ream,用来处理由文件的数,用来处理由文件的数据输入以及向文件的数据输出。具体应用过程如据输入以及向文件的数据输出。具体应用过程如下:(以输入文件流为例)下:(以输入文件流为例)1、定义相关的流对象、定义相关的流对象 文件流类型的定义都在文件流类型的定义都在fstream.h头文件中,头文件中,应用时需包含该文件。应用时需包含该文件。 #include ifstream in; /定义输入文件流对象定义输入文件流对象in,处,处理文件数据的理文件数据的 读入操作;读入操作; ofstream out; /定义输出文件流对象定义输出文件流对象out,处理数据的文件输出操作;处理数据的文件输出操
35、作; fstream io; /定义输入定义输入/输出文件流对象输出文件流对象io,处理数据的文件读入处理数据的文件读入/输出操作;输出操作;2、以流对象打开相关文件、以流对象打开相关文件 io.open(“D:data.txt”); /对打开失败的异对打开失败的异常处理略常处理略 3、数据读入、数据读入写出写出 ioabname; io123“ ”345“ ”“ ”endl;4、关闭文件、关闭文件 文件使用结束,应当关闭相关文件文件使用结束,应当关闭相关文件 in.close(); 所谓动态,就是内存的使用由用户控制,在需要时分配,所谓动态,就是内存的使用由用户控制,在需要时分配,使用完毕随
36、时释放;并且动态存储技术是在程序运行时分使用完毕随时释放;并且动态存储技术是在程序运行时分配和释放存储空间的。在配和释放存储空间的。在C+中,使用两个操作符中,使用两个操作符new和和delete来完成相应的操作,其优越性表现在以下三个方面:来完成相应的操作,其优越性表现在以下三个方面: (1)new可以自动计算类型的大小并分配需要的内存空可以自动计算类型的大小并分配需要的内存空间,从而避免人为计算与分配可能造成的错误和浪费;间,从而避免人为计算与分配可能造成的错误和浪费; (2)new 自动返回正确的指针类型,不必对返回类型进自动返回正确的指针类型,不必对返回类型进行类型转换;行类型转换;
37、(3)可以使用)可以使用new将待分配的内存单元初始化。将待分配的内存单元初始化。 在在C+中,使用中,使用new动态分配存储空间;使用动态分配存储空间;使用delete释放释放new分配的空间。分配的空间。 (1)new的语法格式的语法格式 类型指针类型指针=new 类型(类型初始化值);类型(类型初始化值); 这里,类型可以是这里,类型可以是系统定义系统定义的的基本数据类型基本数据类型,也可以是,也可以是用用户定义户定义的的结构体、枚举或结构体、枚举或C+的类类型的类类型。2-4 动态存储动态存储 例如:例如: int *s=new int; double *PI=new double(3
38、.1415926); student *A=new student100; 程序运行时,动态分配一个整形存储空间,并把地址返回程序运行时,动态分配一个整形存储空间,并把地址返回给指针给指针s;动态分配一个;动态分配一个double类型空间,初始化为类型空间,初始化为3.1415926,并把地址返回给指针,并把地址返回给指针p;动态分配一个;动态分配一个double类型数组空间,并把地址返回给指针类型数组空间,并把地址返回给指针A。这些动态。这些动态分配的内存空间从分配后开始存在,直到分配的内存空间从分配后开始存在,直到delete释放释放它们,它们,或者或者计算机关机为止计算机关机为止(可见(
39、可见动态分配的存储空间具有动态分配的存储空间具有“超超静态静态”变量的性质变量的性质)。所以,特别注意:)。所以,特别注意:new和和delete应应“配对配对”使用使用,以免造成计算机内存资源的浪费。,以免造成计算机内存资源的浪费。 (2)delete的语法格式的语法格式 delete 类型指针;类型指针; 对于上面三个用对于上面三个用new分配的动态存储单元,可用以下方法分配的动态存储单元,可用以下方法释放释放 delete s; delete p; delete A; 需要注意的是,释放数组空间时,不需要给出数组的大小。需要注意的是,释放数组空间时,不需要给出数组的大小。第三章第三章 面
40、向对象程序设计与面向对象程序设计与C+ 3-1 面向对象程序设计思想面向对象程序设计思想 面向对象与结构化面向对象与结构化 结构化按功能分块;面向对象按对象分块;结构化按功能分块;面向对象按对象分块; 结构化只分函数;面向对象数据与函数全分;结构化只分函数;面向对象数据与函数全分; 结构化方法复杂;面向对象方法简单;结构化方法复杂;面向对象方法简单; 面向对象是分块方法,结构化是实现细节。面向对象是分块方法,结构化是实现细节。 面向对象的基本概念面向对象的基本概念 1、对象与封装、对象与封装 (成员变量、成员函数)(成员变量、成员函数) 2、类与继承、类与继承 3、消息、消息 4、多态性、多态
41、性面向对象的软件分析与设计面向对象的软件分析与设计 面向对象分析的核心是分析并确定问题域中存在的概念及面向对象分析的核心是分析并确定问题域中存在的概念及其关联关系。面向对象设计在根本是面向对象分析的继其关联关系。面向对象设计在根本是面向对象分析的继续,在明确了相关概念及其基本关系后,面向对象设计续,在明确了相关概念及其基本关系后,面向对象设计的根本目的是要确定软件系统的概念结构及其具体关系。的根本目的是要确定软件系统的概念结构及其具体关系。也就是确定每个类的具体功能、结构、关键技术、数学也就是确定每个类的具体功能、结构、关键技术、数学模型以及在类间存在的继承关系。模型以及在类间存在的继承关系。
42、 面向对象的面向对象的C+语言语言 我们知道,我们知道,C语言中的结构体可以用来表示一个概念的内语言中的结构体可以用来表示一个概念的内涵,在结构体中加入函数就可以表示一个概念的所有属涵,在结构体中加入函数就可以表示一个概念的所有属性与行为特征,从而表示一个完整的概念。所以,有人性与行为特征,从而表示一个完整的概念。所以,有人说,说,C+中的类就是在中的类就是在C语言结构体中加上函数,虽然语言结构体中加上函数,虽然这样的说法过于片面,但对于理解是很有帮助的。这样的说法过于片面,但对于理解是很有帮助的。 3-2 C+类与对象类与对象 类是对具有相同属性和行为的一组对象的类是对具有相同属性和行为的一
43、组对象的类型化声明类型化声明/定义。它定义。它为属于该类的所有对为属于该类的所有对象提供了统一的象提供了统一的定义定义(抽象描述)方法。(抽象描述)方法。 内部成分:内部成分:成员变量成员变量(属性(属性/状态)状态)+成员成员函数函数(行为(行为/功能)功能) 利用类可以实现数据的封装、隐藏、继承利用类可以实现数据的封装、隐藏、继承与派生。与派生。 作用:定义对象作用:定义对象+建立新类(继承)建立新类(继承) 利用类易于编写利用类易于编写大型、复杂大型、复杂程序,其程序,其模块模块化程度远远高于化程度远远高于C中采用的函数方法。中采用的函数方法。 C+类的概念是由类的概念是由C语言结构体发
44、展来的语言结构体发展来的。类 和 对 象类的声明格式 类是一种类是一种用户自定义类型用户自定义类型,声明格式:,声明格式:classclass 类名类名 / / class class 为声明关键字为声明关键字 public:public: (外部接口)(外部接口) private:private: protected:protected: ;/ / 声明是语句,不要忘记声明是语句,不要忘记“;” 类 和 对 象公有类型成员在关键字在关键字public后面声明,它们后面声明,它们是类与外部的接口,任何外部函数是类与外部的接口,任何外部函数都可以访问都可以访问本类对象的本类对象的公有类型公有类型
45、成成员变量员变量和和成员成员函数。函数。作用:实现本作用:实现本类对象的对外服务(与用户需求有类对象的对外服务(与用户需求有关)。关)。类 和 对 象私有类型成员在关键字在关键字private后面声明后面声明的成员的成员,只允许本类中的函数访问,而类外部的只允许本类中的函数访问,而类外部的任何函数都不能访问。作用:用以实现任何函数都不能访问。作用:用以实现该类的内部功能细节(这些细节与用户该类的内部功能细节(这些细节与用户无关)。无关)。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。(类中不声明类(类中不
46、声明类型时缺省为型时缺省为privateprivate形式成员)形式成员)结构体?结构体?类 和 对 象保护类型对用户而言:与对用户而言:与private相同,其差别相同,其差别表现在表现在继承与派生时对派生类的影响不继承与派生时对派生类的影响不同同,后面讲。,后面讲。类 和 对 象类的构造classclass ClockClock public: public: void void SetTime(int NewH, int NewMSetTime(int NewH, int NewM, , int NewS int NewS);); void ShowTime(); void ShowTi
47、me(); private: private: int int Hour, Minute, Second; Hour, Minute, Second;类 和 对 象成员变量成员变量成员函数成员函数 类类 名名类的成员函数通常在类的外部进行定义。格式:类的成员函数通常在类的外部进行定义。格式:返回类型返回类型 类名类名:函数名(参数表)函数名(参数表) 注:注:1、注明类名、注明类名 “:”表示属性(的)表示属性(的) 2、返回类型与声明一致、返回类型与声明一致 3、定义时,必须给出形参名(在类中声明时、定义时,必须给出形参名(在类中声明时可以只给出类型名)可以只给出类型名)类 和 对 象例:例
48、:ClockClock类函数定义类函数定义void Clock:SetTime(int NewH, int NewM,int NewSvoid Clock:SetTime(int NewH, int NewM,int NewS) ) Hour=NewH Hour=NewH; ; Minute=NewM Minute=NewM; ; Second=NewS Second=NewS; ; ShowTime();ShowTime(); void Clock:ShowTimevoid Clock:ShowTime()() coutHour:Minute:Secondendl coutHour:Minu
49、te:Second成员名成员名”方式访方式访问问 public 属性的成员属性的成员 - =“的的” 类中的类中的this指针指针 任何类中都包含缺省的任何类中都包含缺省的this指针指针 this指向当前被操作对象指向当前被操作对象 使用使用this-a=8; 更容易理解更容易理解类 和 对 象例7-1类的应用举例#includeiostream.h#include class Clockclass Clock ./ ./类的声明略类的声明略;/./.类的实现略类的实现略intint main() main() Clock Clock myClockmyClock; ; myClock.Se
50、tTimemyClock.SetTime(8,30,30);(8,30,30); myClock.ShowTimemyClock.ShowTime();(); 类 和 对 象 类的构造函数 构造函数的作用是在构造函数的作用是在创建对象时创建对象时(定义对象定义对象时时)使用特定的值构造对象,或者说将对象使用特定的值构造对象,或者说将对象初始化初始化为某一个特定的状态。为某一个特定的状态。 在对象创建时在对象创建时由系统自动调用由系统自动调用。 是为系统编写的,通常不以对象方式访问。是为系统编写的,通常不以对象方式访问。 如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一