测绘程序设计课件

上传人:风*** 文档编号:174855518 上传时间:2022-12-17 格式:PPT 页数:277 大小:2.52MB
返回 下载 相关 举报
测绘程序设计课件_第1页
第1页 / 共277页
测绘程序设计课件_第2页
第2页 / 共277页
测绘程序设计课件_第3页
第3页 / 共277页
点击查看更多>>
资源描述
测绘程序设计与测绘程序设计与C+编程编程长安大学长安大学 杨建华杨建华2012年年8月月第一章第一章 绪绪 论论第一节第一节 本课程的研究内容本课程的研究内容测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都可以使用计算机来完成。本课程主要讲述以下内容:可以使用计算机来完成。本课程主要讲述以下内容:(1)面向对象软件设计的思想与面向对象软件设计的思想与C+语言。语言。(2)测绘数据处理常用工具类设计。矩阵的概念及其相关计算,角测绘数据处理常用工具类设计。矩阵的概念及其相关计算,角度度-弧度互化的函数、测量正反算函数以及正态分位数函数。弧度互化的函数、测量正反算函数以及正态分位数函数。(3)基本平差程类基本平差程类adj设计。最小二乘平差与抗差估计。设计。最小二乘平差与抗差估计。(4)高程网平差类设计。水准网、三角高程网平差的相关计算问题。高程网平差类设计。水准网、三角高程网平差的相关计算问题。(5)平面网平差类设计。三角网、边角网、测边网平差的相关计算平面网平差类设计。三角网、边角网、测边网平差的相关计算问题。问题。(6)GPS向量网平差类设计。观测值为向量网平差类设计。观测值为GPS基线向量网的三维坐标基线向量网的三维坐标平差。平差。(7)测量坐标系转化类设计。测量坐标系转化程序设计技术,主要测量坐标系转化类设计。测量坐标系转化程序设计技术,主要包括空间直角坐标系与大地地理坐标系的转换、高斯投影转换与平包括空间直角坐标系与大地地理坐标系的转换、高斯投影转换与平面直角坐标系的转换程序。面直角坐标系的转换程序。(8)综合应用类设计。建立一个综合应用类,封装以上七个数据处综合应用类设计。建立一个综合应用类,封装以上七个数据处理功能,为用户的具体问题计算应用提供方便。理功能,为用户的具体问题计算应用提供方便。平差问题程序计算特点平差问题程序计算特点 平差程序计算:速度快、精度高、数据处理自动化;平差程序计算:速度快、精度高、数据处理自动化;从程序设计的角度看,程序设计与平差计算从程序设计的角度看,程序设计与平差计算相对独立相对独立。在程序设计时必须考虑需要处理的所有问题的普遍性和在程序设计时必须考虑需要处理的所有问题的普遍性和规律性。规律性。在程序计算时,选择平差方法的依据不同:在程序计算时,选择平差方法的依据不同:在在手工计算手工计算时,我们通常希望尽量时,我们通常希望尽量降低计算工作量降低计算工作量。当。当 必要观测数必要观测数 t 多余观测数多余观测数 r:条件平差;:条件平差;必要观测数必要观测数 t结构化程序设计(结构化程序设计(C)按组成结构分块按组成结构分块=面向对象程序设计面向对象程序设计 (C+)模块的功能用的其他模块),引用的全局变量,调模块接口(输入、输出外部特征序代码实现模块具体功能的程模块的局部数据内部特征模块的性质 结构化方法(结构化方法(C语言)语言)功能分解:大事化小(将复杂的功能结构分解为一系列小功能分解:大事化小(将复杂的功能结构分解为一系列小的、相对独立、简单的局部功能结构)的、相对独立、简单的局部功能结构)按功能划分模块,要求每个模块包含单一、具体的功按功能划分模块,要求每个模块包含单一、具体的功能能 使每个模块独立性好,要求一个模块具有较强的内聚使每个模块独立性好,要求一个模块具有较强的内聚性和较弱的耦合性。方便于模块的独立开发、调试,性和较弱的耦合性。方便于模块的独立开发、调试,同时,使模块具有很好的移植性。同时,使模块具有很好的移植性。划分模块时,应当尽量减小模块间的耦合性,例如尽可能划分模块时,应当尽量减小模块间的耦合性,例如尽可能地使用局部变量就可以减小模块之间的耦合性。采用层次地使用局部变量就可以减小模块之间的耦合性。采用层次结构进行分析结构进行分析(方法方法):最上层模块是对系统整体功能的抽象;最上层模块是对系统整体功能的抽象;下层模块是对上层模块的逐步细化、分解、描述;下层模块是对上层模块的逐步细化、分解、描述;重复(重复(2),得出便于实现的独立性好的模块,直到下),得出便于实现的独立性好的模块,直到下层模块不可再分为止。在最下层,对层模块不可再分为止。在最下层,对“怎么做怎么做”作出作出精确的描述。精确的描述。平差程序结构化分块方法平差程序结构化分块方法 面向对象方法(面向对象方法(C+语言)语言)结构化方法的缺陷:结构化方法的缺陷:1)基于功能分块的设计方法。)基于功能分块的设计方法。2)对数据与处理方法的分离与割裂。)对数据与处理方法的分离与割裂。3)可重用性差。)可重用性差。面向对象方法的基本思想:面向对象方法的基本思想:面向对象方法直接分析现实世界或问题空间的概念组面向对象方法直接分析现实世界或问题空间的概念组成结构,使用这些成结构,使用这些概念概念将需要研究的大问题将需要研究的大问题划分划分成一系列成一系列独立的小问题。独立的小问题。在问题分析与软件设计时,与结构化设计方法的最大在问题分析与软件设计时,与结构化设计方法的最大区别是区别是结构化按照功能独立性要求进行功能模块划分结构化按照功能独立性要求进行功能模块划分;面面向对象方法使用概念对数据与功能进行整体划分向对象方法使用概念对数据与功能进行整体划分,其模块,其模块化程度更完整、独立性更好。化程度更完整、独立性更好。面向对象以客观世界固有的事物面向对象以客观世界固有的事物(对象对象)为基本单位来构造软为基本单位来构造软件系统,用人类一般的的思维方法来认识、理解和描述客观件系统,用人类一般的的思维方法来认识、理解和描述客观事物(软件系统),其思想本质是直接事物(软件系统),其思想本质是直接模拟现实模拟现实问题空间的问题空间的事物组成结构及其运行与功能关系。事物组成结构及其运行与功能关系。对象对象=数据数据+算法(程序?)算法(程序?)程序程序=对象对象1+对象对象2+.对象是一个包含数据与算法的相对独立的封闭系统,其内部对象是一个包含数据与算法的相对独立的封闭系统,其内部结构特征为表示对象属性的数据和表示行为与功能的函数结结构特征为表示对象属性的数据和表示行为与功能的函数结构,构,对象内部的数据与功能是密不可分的对象内部的数据与功能是密不可分的。对象本身是一个。对象本身是一个独立的数据与功能单元,也就是说,一个独立的数据与功能单元,也就是说,一个对象就是一个(小)对象就是一个(小)的软件系统的软件系统。面向对象的思想是将客观事物看作具有属性和行为的对象;面向对象的思想是将客观事物看作具有属性和行为的对象;将问题分解为不同的对象,一个复杂对象由若干个简单对象将问题分解为不同的对象,一个复杂对象由若干个简单对象构成。通过消息实现对象之间的联系,构造复杂系统;通过构成。通过消息实现对象之间的联系,构造复杂系统;通过抽象找出同一类对象的共同属性和行为,形成类;通过类的抽象找出同一类对象的共同属性和行为,形成类;通过类的继承与多态实现代码重用。继承与多态实现代码重用。第三节第三节 面向对象程序设计面向对象程序设计 面向对象的基本概念面向对象的基本概念 类类 分类分类把具有共同性质的事物划分为一类,得出一个抽把具有共同性质的事物划分为一类,得出一个抽象的象的概念概念。面向对象的类面向对象的类对具有相同属性和行为的一组对象集合对具有相同属性和行为的一组对象集合的描述。的描述。类之间的关系类之间的关系 一般与特殊:某个类的对象同时是另一个类的对象,如动一般与特殊:某个类的对象同时是另一个类的对象,如动物类与人类,鸟类与丹顶鹤类。物类与人类,鸟类与丹顶鹤类。整体与局部:一个实体的物理构成,空间上的包容及组织整体与局部:一个实体的物理构成,空间上的包容及组织机构等。机构等。关联:两个类的对象实例之间具有某种依赖关系,如某人关联:两个类的对象实例之间具有某种依赖关系,如某人为某个公司工作,教师指导学生论文,某人拥有汽车。为某个公司工作,教师指导学生论文,某人拥有汽车。l 封装封装(对象)(对象)封装是把一组数据和与其有关的操作集合封装是把一组数据和与其有关的操作集合组装在一起,形成一个能动的实体。封装的目的是增强安组装在一起,形成一个能动的实体。封装的目的是增强安全性和控制用户操作。用户不必了解对象内部具体的实现全性和控制用户操作。用户不必了解对象内部具体的实现细节,只需要通过外部接口来使用对象的成员。如:生活细节,只需要通过外部接口来使用对象的成员。如:生活中的封装实体中的封装实体集成电路;面向对象中的封装实体集成电路;面向对象中的封装实体对象。对象。l 继承(类)继承(类)保持已有类的特性而构造新类的过程称为继承。保持已有类的特性而构造新类的过程称为继承。特殊类拥有其一般类的全部属性与服务,称作特殊类对一特殊类拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:如船与轮船;丹顶鹤与鸟类。般类的继承。例如:如船与轮船;丹顶鹤与鸟类。当一个类拥有另一个类的所有数据和操作时,就称这两个当一个类拥有另一个类的所有数据和操作时,就称这两个类之间存在着继承关系。类之间存在着继承关系。父类:被继承的已有类称为父类、基类。父类:被继承的已有类称为父类、基类。子类:继承了父类的所有数据和操作的类就为子类、派生子类:继承了父类的所有数据和操作的类就为子类、派生类。类。单继承:一个类只有一个父类。单继承:一个类只有一个父类。多继承:一个类有多个父类。多继承:一个类有多个父类。l 派生(类)派生(类)在已有类的基础上新增自己的特性而产生新类在已有类的基础上新增自己的特性而产生新类的过程称为派生。派生出的新类称为派生类。派生的目的:的过程称为派生。派生出的新类称为派生类。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造(时,需要对原有程序进行改造(增加成员增加成员)。)。l 消息(对象间)消息(对象间)消息是对象之间建立联系的通信机制。提消息是对象之间建立联系的通信机制。提供服务的对象负责消息协议的格式和消息的接收,请求服供服务的对象负责消息协议的格式和消息的接收,请求服务的对象提供输入信息,获取应答消息内容。消息的使用务的对象提供输入信息,获取应答消息内容。消息的使用类似于函数调用。类似于函数调用。l 多态性多态性:同样的消息被不同的对象接受所导致不同的行:同样的消息被不同的对象接受所导致不同的行为为。多态意味着可以关联不同的实例对象,从而产生不。多态意味着可以关联不同的实例对象,从而产生不同的行为,在面向对象的软件技术中,多态性也可以理解同的行为,在面向对象的软件技术中,多态性也可以理解为不同的对象可以调用相同名称的函数,导致完全不同的为不同的对象可以调用相同名称的函数,导致完全不同的行为的现象。行为的现象。增加了面向对象软件系统的灵活性,进一步减少了信息冗增加了面向对象软件系统的灵活性,进一步减少了信息冗余,提高了软件的可重用性和可扩充性余,提高了软件的可重用性和可扩充性。l 面向对象方法特点面向对象方法特点 1)与人类习惯的思维方法一致)与人类习惯的思维方法一致 面向对象的设计方法使用现实世界的概念思考问题。它强面向对象的设计方法使用现实世界的概念思考问题。它强调模拟现实世界中的概念而不强调算法。调模拟现实世界中的概念而不强调算法。2)稳定性好)稳定性好 现实世界中的实体是相对稳定的,因此以对象为中心构造现实世界中的实体是相对稳定的,因此以对象为中心构造的软件系统也是比较稳定的。的软件系统也是比较稳定的。面向对象软件系统的结构是根据问题领域的模型建立起来面向对象软件系统的结构是根据问题领域的模型建立起来的,而不是根据系统应完成的功能的分解建立的。因此当的,而不是根据系统应完成的功能的分解建立的。因此当系统功能需求变化时,不会引起软件结构的整体变化。系统功能需求变化时,不会引起软件结构的整体变化。3)可重用性好)可重用性好 软件重用定义:软件重用是指在不同的软件开发过程中重软件重用定义:软件重用是指在不同的软件开发过程中重复使用相同或相似软件元素的过程。复使用相同或相似软件元素的过程。传统软件重用技术:利用标准函数库。但难以适应不同场传统软件重用技术:利用标准函数库。但难以适应不同场合的不同需要,通常绝大多数函数都是新编的。合的不同需要,通常绝大多数函数都是新编的。4)易于开发大型软件产品)易于开发大型软件产品 软件成本降低,整体质量提高。软件成本降低,整体质量提高。第四节第四节 测绘数据处理程序设计测绘数据处理程序设计 第五节第五节 VC+6.0程序开发环境程序开发环境 Visual C+是微软使用是微软使用C+语言的语言的Windows程序程序开发平台,该平台支持程序程序开发平台,该平台支持C+控制台程序开发(控制台程序开发(dos以以main()函()函数为程序主要入口)要求。数为程序主要入口)要求。C+兼容兼容C,所,所以也可以用来设计以也可以用来设计C语言的结构化程序。本语言的结构化程序。本课程采用课程采用Visual C+6.0作为程序开发平台。作为程序开发平台。Visual C+6.0是是Windows程序,以菜单定程序,以菜单定义相关操作功能,应用方便。其桌面布局义相关操作功能,应用方便。其桌面布局(图(图1):):客户区是代码输入、编辑区,在该区域输客户区是代码输入、编辑区,在该区域输入、编辑入、编辑C/C+程序源代码;程序源代码;图1 Visual C+6.0 开发环境 工作区是工作区是VC+程序开发管理区,在此系统列出软程序开发管理区,在此系统列出软件相关的文件、件相关的文件、Windows资源、相关函数、变量、资源、相关函数、变量、类等结构。在控制台程序设计中,主要用来管理类等结构。在控制台程序设计中,主要用来管理相关结构、函数、定义的全局变量等。相关结构、函数、定义的全局变量等。输出区主要显示程序的编译、连接、调试等的输出区主要显示程序的编译、连接、调试等的结果或数据。在控制台程序开发中,主要用于编结果或数据。在控制台程序开发中,主要用于编译结果显示,在此查看程序编译错误。译结果显示,在此查看程序编译错误。*程序运行时,弹出程序运行时,弹出Windows运行窗口(图运行窗口(图2),),默认条件下,背景为黑色,文字为白色。文字可默认条件下,背景为黑色,文字为白色。文字可浏览、不可编辑。在此可以以键盘输入程序数据。浏览、不可编辑。在此可以以键盘输入程序数据。运行完毕,点击任意键关闭此窗口。运行完毕,点击任意键关闭此窗口。以下在说明以下在说明Visual C+6.0环境下,开发环境下,开发Dos程序程序的主要过程:的主要过程:图图 2 程序运行窗口程序运行窗口 1选择选择“新建新建”,在弹出的,在弹出的“新建新建”窗口下点击窗口下点击“文件文件”,弹出,弹出窗口:窗口:2.代码输入、编辑与编译连接代码输入、编辑与编译连接3.程序运行程序运行4.打开已有文件或工作区打开已有文件或工作区 如上图所示,点击文件菜单下如上图所示,点击文件菜单下“打开打开”选选项,可以打开项,可以打开.Cpp、.h等文件,也可以通等文件,也可以通过文件类型选择打开其他文件(例如过文件类型选择打开其他文件(例如.txt文文件)。件)。点击文件菜单下点击文件菜单下“打开打开 工作区工作区”选项,可选项,可以打开以打开.dsw文件,打开一个工作区文件,文件,打开一个工作区文件,则已编译、连接的所有文件都会打开,包则已编译、连接的所有文件都会打开,包括已有的括已有的.exe文件。所以,可以直接运行文件。所以,可以直接运行该程序;也可以重新编辑源代码,再编译、该程序;也可以重新编辑源代码,再编译、运行。运行。例:例:第二章第二章 C+语言新技术语言新技术 2-1 函数重载函数重载函数重载函数重载在在C语言中,为定义不同类型数据相加的操作,必须使语言中,为定义不同类型数据相加的操作,必须使用不同的函数名来定义一组函数。用不同的函数名来定义一组函数。Iplus()整数相加;整数相加;Dplus()实数相加;实数相加;Fplus()浮点数相加;浮点数相加;Cplus()字符串相加。字符串相加。在在C+语言中,可以使用更简洁的方法处理这种问题。语言中,可以使用更简洁的方法处理这种问题。对以上四种计算可以只使用一个函数名对以上四种计算可以只使用一个函数名plus定义相关的定义相关的不同函数。计算机函数编译的区别标志在于不同函数。计算机函数编译的区别标志在于函数的参数函数的参数不同不同。在应用时,就可以以一个相同的函数名调用一族。在应用时,就可以以一个相同的函数名调用一族函数。这就是函数。这就是C+语言函数重载的概念。语言函数重载的概念。使用一个已经存在的函数名定义一个新函数叫对原有使用一个已经存在的函数名定义一个新函数叫对原有函函数的重载数的重载。定义重载函数的关键在于同名函数应当具有定义重载函数的关键在于同名函数应当具有不同的参数不同的参数。参数不同:函数参数的参数不同:函数参数的类型不同类型不同或函数参数的或函数参数的个数不同个数不同。对于上例问题,可以定义一组重载函数对于上例问题,可以定义一组重载函数(函数定义略函数定义略):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);重载的使用使程序的编写与使用具有方便性。应当注意的重载的使用使程序的编写与使用具有方便性。应当注意的是,对于在操作和概念上不具有相似性的函数尽量不要使是,对于在操作和概念上不具有相似性的函数尽量不要使用重载,以免引起使用者的误解。用重载,以免引起使用者的误解。运算符重载运算符重载:C+运算符可以处理基本类运算符可以处理基本类型数据的计算问题,但不能用于用户定义型数据的计算问题,但不能用于用户定义的新类型(类)数据的计算。的新类型(类)数据的计算。如果需要为用户定义的新类型定义运算符如果需要为用户定义的新类型定义运算符操作功能,可以使用运算符函数对已有运操作功能,可以使用运算符函数对已有运算符定义新功能。这种新功能定义叫算符定义新功能。这种新功能定义叫运算运算符重载符重载。运算符函数格式:运算符函数格式:返回值返回值 operator 操作符(参数表);操作符(参数表);对类类型数据的运算符重载可以使用友元对类类型数据的运算符重载可以使用友元函数与成员函数两种形式进行定义。在后函数与成员函数两种形式进行定义。在后面讲。面讲。1、引用的概念、引用的概念 是是C+区别于区别于C的另一个技术特征。引用的作用在的另一个技术特征。引用的作用在于函数的参数传递,使用引用,可以以变量名直于函数的参数传递,使用引用,可以以变量名直接实现函数参数的接实现函数参数的双向传递双向传递。那什么是引用呢?简单地说,那什么是引用呢?简单地说,引用是对一个引用是对一个取的别名取的别名,也就是给一个变量取的第二个名字。,也就是给一个变量取的第二个名字。常量不可以建立引用。例如:常量不可以建立引用。例如:int i;int&j=i;这里,这里,i是一个变量,定义是一个变量,定义j为为i的引用。系统不再的引用。系统不再为为j分配存储空间,而让分配存储空间,而让j与与i使用相同的存储空间使用相同的存储空间。这时,在程序中任何对这时,在程序中任何对j的访问就是对的访问就是对i的访问。的访问。引用的最主要作用在于函数参数的传递,也就是引用的最主要作用在于函数参数的传递,也就是定义函数的参数为引用类型。定义函数的参数为引用类型。2-2 引引 用用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在该程序中,我们发现,在该程序中,我们发现,形参的改变导致了实参的改变形参的改变导致了实参的改变。原因在于函。原因在于函数中定义的函数形参为实参的引用。这种作用在程序设计中具有很强数中定义的函数形参为实参的引用。这种作用在程序设计中具有很强的应用价值。的应用价值。C语言使用标准输入语言使用标准输入/输出库输出库函数函数完成数据的输入与输出,在使用中,需要完成数据的输入与输出,在使用中,需要判断数据类型,应用不方便。判断数据类型,应用不方便。C+使用面使用面向对象的方法实现数据的输入向对象的方法实现数据的输入/输出,使用输出,使用上更灵活、简便。上更灵活、简便。C+使用输入输出流使用输入输出流定义数定义数据的键盘输入与屏幕输出,并预定义了两据的键盘输入与屏幕输出,并预定义了两个应用对象个应用对象cin和和cout,cin用来实现数据用来实现数据的键盘输入;的键盘输入;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;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 由程序可以看出,使用输入输出流在程序设计中处理数据由程序可以看出,使用输入输出流在程序设计中处理数据的输入与输出的方便性。的输入与输出的方便性。文件流文件流 文件流是文件流是C+以面向对象的方法定义的以面向对象的方法定义的文件格式文件格式的数据输入的数据输入/输出方法。在需要处理大数据量时使输出方法。在需要处理大数据量时使用文件管理数据是非常必要的。从而也可以使数用文件管理数据是非常必要的。从而也可以使数据处理的结果以文件形式被永久保存。据处理的结果以文件形式被永久保存。C+有三种文件流:有三种文件流:输入文件流输入文件流 ifstream,用来处理由文件的数据输,用来处理由文件的数据输入;入;输出文件流输出文件流 ofstream,用来处理向文件的数据,用来处理向文件的数据输出;输出;输入输入/输出文件流输出文件流fstream,用来处理由文件的数,用来处理由文件的数据输入以及向文件的数据输出。具体应用过程如据输入以及向文件的数据输出。具体应用过程如下:(以输入文件流为例)下:(以输入文件流为例)1、定义相关的流对象、定义相关的流对象 文件流类型的定义都在文件流类型的定义都在fstream.h头文件中,头文件中,应用时需包含该文件。应用时需包含该文件。#include ifstream in;/定义输入文件流对象定义输入文件流对象in,处,处理文件数据的理文件数据的 读入操作;读入操作;ofstream out;/定义输出文件流对象定义输出文件流对象out,处理数据的文件输出操作;处理数据的文件输出操作;fstream io;/定义输入定义输入/输出文件流对象输出文件流对象io,处理数据的文件读入处理数据的文件读入/输出操作;输出操作;2、以流对象打开相关文件、以流对象打开相关文件 io.open(“D:data.txt”);/对打开失败的异对打开失败的异常处理略常处理略 3、数据读入、数据读入写出写出 ioabname;io123“”345“”“”endl;4、关闭文件、关闭文件 文件使用结束,应当关闭相关文件文件使用结束,应当关闭相关文件 in.close();所谓动态,就是内存的使用由用户控制,在需要时分配,所谓动态,就是内存的使用由用户控制,在需要时分配,使用完毕随时释放;并且动态存储技术是在程序运行时分使用完毕随时释放;并且动态存储技术是在程序运行时分配和释放存储空间的。在配和释放存储空间的。在C+中,使用两个操作符中,使用两个操作符new和和delete来完成相应的操作,其优越性表现在以下三个方面:来完成相应的操作,其优越性表现在以下三个方面:(1)new可以自动计算类型的大小并分配需要的内存空可以自动计算类型的大小并分配需要的内存空间,从而避免人为计算与分配可能造成的错误和浪费;间,从而避免人为计算与分配可能造成的错误和浪费;(2)new 自动返回正确的指针类型,不必对返回类型进自动返回正确的指针类型,不必对返回类型进行类型转换;行类型转换;(3)可以使用)可以使用new将待分配的内存单元初始化。将待分配的内存单元初始化。在在C+中,使用中,使用new动态分配存储空间;使用动态分配存储空间;使用delete释放释放new分配的空间。分配的空间。(1)new的语法格式的语法格式 类型指针类型指针=new 类型(类型初始化值);类型(类型初始化值);这里,类型可以是这里,类型可以是系统定义系统定义的的基本数据类型基本数据类型,也可以是,也可以是用用户定义户定义的的结构体、枚举或结构体、枚举或C+的类类型的类类型。2-4 动态存储动态存储 例如:例如:int*s=new int;double*PI=new double(3.1415926);student*A=new student100;程序运行时,动态分配一个整形存储空间,并把地址返回程序运行时,动态分配一个整形存储空间,并把地址返回给指针给指针s;动态分配一个;动态分配一个double类型空间,初始化为类型空间,初始化为3.1415926,并把地址返回给指针,并把地址返回给指针p;动态分配一个;动态分配一个double类型数组空间,并把地址返回给指针类型数组空间,并把地址返回给指针A。这些动态。这些动态分配的内存空间从分配后开始存在,直到分配的内存空间从分配后开始存在,直到delete释放释放它们,它们,或者或者计算机关机为止计算机关机为止(可见(可见动态分配的存储空间具有动态分配的存储空间具有“超超静态静态”变量的性质变量的性质)。所以,特别注意:)。所以,特别注意:new和和delete应应“配对配对”使用使用,以免造成计算机内存资源的浪费。,以免造成计算机内存资源的浪费。(2)delete的语法格式的语法格式 delete 类型指针;类型指针;对于上面三个用对于上面三个用new分配的动态存储单元,可用以下方法分配的动态存储单元,可用以下方法释放释放 delete s;delete p;delete A;需要注意的是,释放数组空间时,不需要给出数组的大小。需要注意的是,释放数组空间时,不需要给出数组的大小。第三章第三章 面向对象程序设计与面向对象程序设计与C+3-1 面向对象程序设计思想面向对象程序设计思想 面向对象与结构化面向对象与结构化 结构化按功能分块;面向对象按对象分块;结构化按功能分块;面向对象按对象分块;结构化只分函数;面向对象数据与函数全分;结构化只分函数;面向对象数据与函数全分;结构化方法复杂;面向对象方法简单;结构化方法复杂;面向对象方法简单;面向对象是分块方法,结构化是实现细节。面向对象是分块方法,结构化是实现细节。面向对象的基本概念面向对象的基本概念 1、对象与封装、对象与封装(成员变量、成员函数)(成员变量、成员函数)2、类与继承、类与继承 3、消息、消息 4、多态性、多态性面向对象的软件分析与设计面向对象的软件分析与设计 面向对象分析的核心是分析并确定问题域中存在的概念及面向对象分析的核心是分析并确定问题域中存在的概念及其关联关系。面向对象设计在根本是面向对象分析的继其关联关系。面向对象设计在根本是面向对象分析的继续,在明确了相关概念及其基本关系后,面向对象设计续,在明确了相关概念及其基本关系后,面向对象设计的根本目的是要确定软件系统的概念结构及其具体关系。的根本目的是要确定软件系统的概念结构及其具体关系。也就是确定每个类的具体功能、结构、关键技术、数学也就是确定每个类的具体功能、结构、关键技术、数学模型以及在类间存在的继承关系。模型以及在类间存在的继承关系。面向对象的面向对象的C+语言语言 我们知道,我们知道,C语言中的结构体可以用来表示一个概念的内语言中的结构体可以用来表示一个概念的内涵,在结构体中加入函数就可以表示一个概念的所有属涵,在结构体中加入函数就可以表示一个概念的所有属性与行为特征,从而表示一个完整的概念。所以,有人性与行为特征,从而表示一个完整的概念。所以,有人说,说,C+中的类就是在中的类就是在C语言结构体中加上函数,虽然语言结构体中加上函数,虽然这样的说法过于片面,但对于理解是很有帮助的。这样的说法过于片面,但对于理解是很有帮助的。3-2 C+类与对象类与对象 类是对具有相同属性和行为的一组对象的类是对具有相同属性和行为的一组对象的类型化声明类型化声明/定义。它定义。它为属于该类的所有对为属于该类的所有对象提供了统一的象提供了统一的定义定义(抽象描述)方法。(抽象描述)方法。内部成分:内部成分:成员变量成员变量(属性(属性/状态)状态)+成员成员函数函数(行为(行为/功能)功能)利用类可以实现数据的封装、隐藏、继承利用类可以实现数据的封装、隐藏、继承与派生。与派生。作用:定义对象作用:定义对象+建立新类(继承)建立新类(继承)利用类易于编写利用类易于编写大型、复杂大型、复杂程序,其程序,其模块模块化程度远远高于化程度远远高于C中采用的函数方法。中采用的函数方法。C+类的概念是由类的概念是由C语言结构体发展来的语言结构体发展来的。类 和 对 象类的声明格式 类是一种类是一种用户自定义类型用户自定义类型,声明格式:,声明格式:classclass 类名类名 /class class 为声明关键字为声明关键字 public:public:(外部接口)(外部接口)private:private:protected:protected:;/声明是语句,不要忘记声明是语句,不要忘记“;”类 和 对 象公有类型成员在关键字在关键字public后面声明,它们后面声明,它们是类与外部的接口,任何外部函数是类与外部的接口,任何外部函数都可以访问都可以访问本类对象的本类对象的公有类型公有类型成成员变量员变量和和成员成员函数。函数。作用:实现本作用:实现本类对象的对外服务(与用户需求有类对象的对外服务(与用户需求有关)。关)。类 和 对 象私有类型成员在关键字在关键字private后面声明后面声明的成员的成员,只允许本类中的函数访问,而类外部的只允许本类中的函数访问,而类外部的任何函数都不能访问。作用:用以实现任何函数都不能访问。作用:用以实现该类的内部功能细节(这些细节与用户该类的内部功能细节(这些细节与用户无关)。无关)。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。(类中不声明类(类中不声明类型时缺省为型时缺省为privateprivate形式成员)形式成员)结构体?结构体?类 和 对 象保护类型对用户而言:与对用户而言:与private相同,其差别相同,其差别表现在表现在继承与派生时对派生类的影响不继承与派生时对派生类的影响不同同,后面讲。,后面讲。类 和 对 象类的构造classclass ClockClock public:public:void void SetTime(int NewH,int NewMSetTime(int NewH,int NewM,int NewS int NewS););void ShowTime();void ShowTime();private:private:int int Hour,Minute,Second;Hour,Minute,Second;类 和 对 象成员变量成员变量成员函数成员函数 类类 名名类的成员函数通常在类的外部进行定义。格式:类的成员函数通常在类的外部进行定义。格式:返回类型返回类型 类名类名:函数名(参数表)函数名(参数表)注:注:1、注明类名、注明类名 “:”表示属性(的)表示属性(的)2、返回类型与声明一致、返回类型与声明一致 3、定义时,必须给出形参名(在类中声明时、定义时,必须给出形参名(在类中声明时可以只给出类型名)可以只给出类型名)类 和 对 象例:例: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:Minute:Second成员名成员名”方式访方式访问问 public 属性的成员属性的成员-=“的的”类中的类中的this指针指针 任何类中都包含缺省的任何类中都包含缺省的this指针指针 this指向当前被操作对象指向当前被操作对象 使用使用this-a=8;更容易理解更容易理解类 和 对 象例7-1类的应用举例#includeiostream.h#include class Clockclass Clock ././类的声明略类的声明略;/./.类的实现略类的实现略intint main()main()Clock Clock myClockmyClock;myClock.SetTimemyClock.SetTime(8,30,30);(8,30,30);myClock.ShowTimemyClock.ShowTime();();类 和 对 象 类的构造函数 构造函数的作用是在构造函数的作用是在创建对象时创建对象时(定义对象定义对象时时)使用特定的值构造对象,或者说将对象使用特定的值构造对象,或者说将对象初始化初始化为某一个特定的状态。为某一个特定的状态。在对象创建时在对象创建时由系统自动调用由系统自动调用。是为系统编写的,通常不以对象方式访问。是为系统编写的,通常不以对象方式访问。如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一个默认形式默认形式的构造函数(的构造函数(不带参数不带参数)。)。允许为允许为内联内联函数、函数、重载重载函数、函数、带默认形参值带默认形参值的函数的函数 不可以被继承不可以被继承(是一个类特有的成员)。(是一个类特有的成员)。格式:格式:函数名与类名相同,无返回类型。函数名与类名相同,无返回类型。构造函数和析构函数构造函数举例class Clockclass Clock public:public:Clock(int NewH=0,int NewM=0,int NewSClock(int NewH=0,int NewM=0,int NewS=0);=0);/声明构造函数声明构造函数void SetTime(int NewH,int NewM,int void SetTime(int NewH,int NewM,int NewSNewS););void ShowTime();void ShowTime();private:private:intint Hour,Minute,Second;Hour,Minute,Second;构造函数和析构函数构造函数的实现:构造函数的实现:Clock:Clock(int NewH=0,int NewM=0,int NewSClock:Clock(int NewH=0,int NewM=0,int NewS=0)=0)Hour=NewHHour=NewH;Minute=NewMMinute=NewM;Second=NewSSecond=NewS;建立对象时构造函数的作用:建立对象时构造函数的作用:intint main()main()Clock a,c(10,20);Clock a,c(10,20);/隐含调用构造函数,将初始值作为实参。隐含调用构造函数,将初始值作为实参。c.ShowTimec.ShowTime();();58拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。其作用为本类的对象引用。其作用为使用已有对象对新对象使用已有对象对新对象初始化初始化。class class 类名类名 public:public:类名(形参);类名(形参);/构造函数构造函数 类名(类名类名(类名&对象名);对象名);/拷贝构造函数声明拷贝构造函数声明 .;类名类名:类(类名类(类名&对象名)对象名)/拷贝构造函数的定义拷贝构造函数的定义 函数体函数体 拷贝构造函数(例7-2)class Pointclass Point public:public:Point(int xx=0,int yy=0)X=xx;Y=yy Point(int xx=0,int yy=0)X=xx;Y=yy;Point(PointPoint(Point&p);&p);int GetX int GetX()return X;()return X;int GetY int GetY()return Y;()return Y;private:private:int int X,Y;X,Y;构造函数和析构函数Point:Point(Point&p)Point:Point(Point&p)X=p.X X=p.X;/;/在在本类的成员函数本类的成员函数中可以访中可以访 Y=p.YY=p.Y;/;/问问本类对象的私有成员本类对象的私有成员。coutcout拷贝构造函数被调用拷贝构造函数被调用endlendl;/类如果是工厂,对象就是产品。类如果是工厂,对象就是产品。61拷贝构造函数(例7-2)当用类的一个当用类的一个已有对象已有对象去去初始化初始化该类的一个该类的一个新新对象对象时系统自动调用拷贝构造函数实现拷贝赋时系统自动调用拷贝构造函数实现拷贝赋值。值。intint main()main()Point A(1,2);Point A(1,2);Point B(A);/Point B(A);/拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endlcoutB.GetX()endl;构造函数和析构函数拷贝构造函数(例7-2)若函数的形参为类对象,调用函数时,若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝实参赋值给形参,系统自动调用拷贝构造函数。例如:构造函数。例如:void fun1(Point p)void fun1(Point p)coutp.GetX()endl coutp.GetX()endl;intint main()main()Point A(1,2);Point A(1,2);fun1(A);/fun1(A);/调用拷贝构造函数调用拷贝构造函数 构造函数和析构函数拷贝构造函数(例7-2)当函数的返回值是类对象时,系统自动调当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:用拷贝构造函数。例如:Point fun2()Point fun2()Point A(1,2);Point A(1,2);return A;/return A;/调用拷贝构造函数调用拷贝构造函数 intint main()main()Point B;Point B;B=fun2();B=fun2();构造函数和析构函数默认的拷贝构造函数如果程序员如果程序员没有为类声明拷贝构造没有为类声明拷贝构造函数函数,则编译器自己生成一个,则编译器自己生成一个默认的拷默认的拷贝构造函数贝构造函数。这个构造函数执行的功能是:用作这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,为初始值的对象的每个数据成员的值,初始化将要建立的对象的初始化将要建立的对象的对应对应数据成员数据成员(完全相同完全相同)。()。(若存在指针成员变量,若存在指针成员变量,引发问题?)引发问题?)构造函数和析构函数 析构函数 完成对象被删除前的一些清理工作。完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,释在对象的生存期结束的时刻系统自动调用它,释放此对象所属的空间。(料理后事)放此对象所属的空间。(料理后事)如果程序中未声明析构函数,编译器将自动产生如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。一个默认的析构函数。只有一个(唯一性)。只有一个(唯一性)。不能被继承。不能被继承。(与构造函数相同与构造函数相同)函数名与类名相同,为区别于构造函数,通常在函数名与类名相同,为区别于构造函数,通常在函数名前加函数名前加“”。无形参、无返回类型。(构造函数可以有形参)无形参、无返回类型。(构造函数可以有形参)构造函数和析构函数构造函数和析构函数举例#includeiostream#include using namespace std;using namespace std;class Pointclass Point public:public:Point(int xx,int yy Point(int xx,int yy););Point();Point();/./.其其他他函数原函数原型型 private:private:int X,int int X,int Y;Y;构造函数和析构函数Point:Point(int xx,int yyPoint:Point(int xx,int yy)X=xx;Y=yy X=xx;Y=yy;cout“Point classs constructor cout“Point classs constructor called”endlcalled”endl;Point:Point()Point:Point()cout“Point classs destructor cout“Point classs destructor called”endlcalled”endl;/./.其其他他函数的实现略函数的实现略68类的应用举例(例7-3)一圆形游泳池如图所示,现在需在其周围建一一圆形游泳池如图所示,现在需在其周围建一圆形过道,并在其四周围上栅栏。栅栏价格为圆形过道,并在其四周围上栅栏。栅栏价格为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽度为平方米。过道宽度为3米,游米,游泳池半径由键盘输入。要求编程计算并输出过道和泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价栅栏的造价。游泳池过道#include iostream.h#include const float PI=3.14159;const float PI=3.14159;const float FencePriceconst float FencePrice=35;=35;const float ConcretePriceconst float ConcretePrice=20;=20;/声明类声明类Circle Circle 及其数据和方法及其数据和方法class Circleclass Circle private:private:float radius;float radius;public:public:Circle(float r);/Circle(float r);/构造函数构造函数 float Circumference();/float Circumference();/圆周长圆周长 float Area();/float Area();/圆面积圆面积;70/类的实现/构造函数初始化数据成员radiusCircle:Circle(float r)radius=r;/计算圆的周长float Circle:Circumference()return 2*PI*radius;/计算圆的面积 float Circle:Area()return PI*radius*radius;71void main()float radius;float FenceCost,ConcreteCost;/提示用户输入半径 coutradius;/声明 Circle 对象 Circle Pool(radius);Circle PoolRim(radius+3);72 /计算栅栏造价并输出 FenceCost=PoolRim.Circumference()*FencePrice;coutFencing Cost is¥FenceCostendl;/计算过道造价并输出 ConcreteCost=(PoolRim.Area()-Pool.Area()*ConcretePrice;coutConcrete Cost is¥ConcreteCostendl;运行结果Enter the radius of the pool:10Fencing Cost is¥2858.85Concrete Cost is¥4335.3973静态成员静态成员的概念:一般情况下,同一个类不同对象的数据成员所占用的一般情况下,同一个类不同对象的数据成员所占用的内存空间是不同的(描述不同对象具有不同的属性值)。内存空间是不同的(描述不同对象具有不同的属性值)。在有些情况下,在有些情况下,类的数据成员的值对每个对象都是相同的类的数据成员的值对每个对象都是相同的,如当前已创建对象的数量,这时可以将该数据成员声明为如当前已创建对象的数量,这时可以将该数据成员声明为静态数据成员静态数据成员(对所有当前对象而言,占有相同的存储单(对所有当前对象而言,占有相同的存储单元)。元)。静态成员是属于类的,被所有对象共享。静态成员静态成员是属于类的,被所有对象共享。静态成员的生存期与类相同。的生存期与类相同。静态成员的声明:静态成员的声明:在声明成员时以关键字在声明成员时以关键字static开头,例如:开头,例如:public:static int m_nCount;静态成员分为静态数据成员和静态成员函数。静态成员分为静态数据成员和静态成员函数。静态数据成员类似于一般的静态数据成员类似于一般的static静态变量,它静态变量,它具有全局性。静态数据成员属于整个类,为类的具有全局性。静态数据成员属于整个类,为类的所有对象共享所有对象共享(例:太阳、地球例:太阳、地球)。无论类的对象有多少,类的静态数据成员只有一无论类的对象有多少,类的静态数据成员只有一份,存储在同一个内存空间。即使没有创建类的份,存储在同一个内存空间。即使没有创建类的一个对象,类的静态数据成员也是存在的。一个对象,类的静态数据成员也是存在的。使用静态数据成员保证了该数据成员值的唯一性。使用静态数据成员保证了该数据成员值的唯一性。静态成员的初始化:放在类定义的外部 int Person:m_nCount=0;静态成员
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!