面向对象程序设计C语言课件

上传人:re****.1 文档编号:569443047 上传时间:2024-07-29 格式:PPT 页数:168 大小:1.17MB
返回 下载 相关 举报
面向对象程序设计C语言课件_第1页
第1页 / 共168页
面向对象程序设计C语言课件_第2页
第2页 / 共168页
面向对象程序设计C语言课件_第3页
第3页 / 共168页
面向对象程序设计C语言课件_第4页
第4页 / 共168页
面向对象程序设计C语言课件_第5页
第5页 / 共168页
点击查看更多>>
资源描述

《面向对象程序设计C语言课件》由会员分享,可在线阅读,更多相关《面向对象程序设计C语言课件(168页珍藏版)》请在金锄头文库上搜索。

1、李爱华 程磊 编著清华大学出版社同名教材配套电子教案20102010年年 2 2月月面向对象程序设计(面向对象程序设计(C+语言)语言)1第一部分第一部分C+语言基础语言基础第章面向对象程序设计概述第章面向对象程序设计概述第章第章C+语言基础语言基础2第章面向对象程序设计概述第章面向对象程序设计概述本章要点:本章要点:v面向过程的程序设计特点面向过程的程序设计特点v面向对象的程序设计概念、基本特征面向对象的程序设计概念、基本特征vVC+环境下环境下C+程序的开发过程程序的开发过程 31.11.1面向过程与面向对象面向过程与面向对象 1.1.11.1.1面向过程的程序设计面向过程的程序设计 v

2、面向过程面向过程的程序设计思想的核心是功的程序设计思想的核心是功能分解,通常采用自顶向下的方法进行程能分解,通常采用自顶向下的方法进行程序设计,即传统的结构化程序设计序设计,即传统的结构化程序设计( (Structured tructured Programming, rogramming, SP )方法方法. . 面向过程的程序设计的范型是面向过程的程序设计的范型是: :程序算法数据结构程序算法数据结构 41.1.2 1.1.2 面向对象的程序设计面向对象的程序设计 v面向对象面向对象程序设计程序设计 (Object-bject-Oriented riented Programmingrog

3、ramming,OOP)方方法强调以问题域(现实世界)中的事物为法强调以问题域(现实世界)中的事物为中心来思考和认识问题,并按照事物的本中心来思考和认识问题,并按照事物的本质特征将其抽象为质特征将其抽象为对象对象,以作为构成软件,以作为构成软件系统的基础。系统的基础。 5面向对象程序设计方法的特点:面向对象程序设计方法的特点: v(1 1)OOPOOP方法以方法以“对象对象”或或“数据数据”为中为中心。心。 v(2 2)引入了)引入了“类类”的概念。的概念。 v(3 3)OOPOOP方法的模块性与继承性保证了新方法的模块性与继承性保证了新的应用程序设计可在原有对象的数据类型的应用程序设计可在原

4、有对象的数据类型和功能的基础上通过重用、扩展和细化来和功能的基础上通过重用、扩展和细化来进行,而不必从头做起或复制原有代码。进行,而不必从头做起或复制原有代码。 6v与与面面向向过过程程的的程程序序设设计计不不同同,面面向向对对象象的的程程序序设设计计是是以以数数据据而而不不是是功功能能为为核核心心,将将数数 据据 以以 及及 对对 这这 些些 数数 据据 的的 操操 作作 以以 类类(classclass)的的形形式式封封装装(encapsulationencapsulation)为为一一个个整整体体,以以类类的的对对象象( (object)object)作作为为程程序序的的基基本本元元素素

5、,通通过过向向对对象象发发送送消消息息(messagemessage),进进而而由由对对象象启启动动相相关关的的方方法法完完成成各各种种功功能能。同同时时,数数据据本本身身不不能能被被类类外外的的程程序序和和过过程程直直接接存存取取,这这种种机机制制增增强了数据的安全性和软件的可靠性。强了数据的安全性和软件的可靠性。7 类与对象是抽象与具体的关系。类与对象是抽象与具体的关系。 v在在面面向向对对象象程程序序设设计计中中,属属性性作作为为类类中中的的数数据据项项称称为为数数据据成成员员(data data membermember),表示一类对象所共有的静态特性;表示一类对象所共有的静态特性;v

6、行行 为为 作作 为为 类类 中中 的的 操操 作作 称称 为为 成成 员员 函函 数数(member member functionfunction),表表示示一一类类对对象象所所共有的动态特性。共有的动态特性。8面向对象的程序设计实例面向对象的程序设计实例 :v一一个个简简单单的的学学生生成成绩绩管管理理系系统统用用来来管管理理若若干个学生的信息。干个学生的信息。v每每个个学学生生的的信信息息包包括括学学号号、姓姓名名、某某门门课课的的平平时时成成绩绩、期期末末成成绩绩、总总评评成成绩绩和和名名次次。为为实实现现成成绩绩的的录录入入、计计算算、排排名名、输输出出等等操作。操作。9class

7、 Student /定义一个类Student /以下几项是数据项,作为类内的数据成员private: /数据成员是私有的,即对外部函数不公开char number10; /学号char name10; /姓名int dailyScore; /平时成绩int finalScore; /期末成绩float generalScorel; /总评成绩int place; /名次public: /以下是类的公有成员函数,是类的对外接口void readData(); /输入当前学生的学号、姓名、平时及期末成绩void calcuScore(); /计算当前学生的总评成绩void printOut();

8、/按一定的格式输出当前学生的完整信息friend void sortScore(Studen stu,int n); /友元,根据总评成绩排名得学生名次;10 /类内函数及友元函数的具体实现代码省略主函数中,通过定义类的对象,再向对象发送消息完成程序。int main() Student stu20; /定义属于类Student的20个学生对象,stui就是每个学生的名字int i,n=5;/n=5表示管理5个学生的成绩for(i=0;in;i+) /通过向5个对象发送消息,对象接受消息后调用成员函数Stui.ReadData(); /ReadData()实现读入每个学生的信息for(i=0;

9、in;i+) /5个对象调用成员函数calcuScore()计算总评成绩Stui.CalcuScore();SortScore(stu,5);/根据总评成绩进行排名,得出每个学生的名次值for(i=0;in;i+) /5个对象调用成员函数PrintOut()输出各自的信息stui.PrintOut();return 0;11通过这个简单示例,可以得出以下结论:通过这个简单示例,可以得出以下结论: v(1 1)面面向向对对象象的的程程序序一一般般由由类类的的定定义义和和类类的的使使用用两两部部分分组组成成,在在函函数数中中定定义义类类的的对对象象,并并向向对对象象发发送送消消息息,使其响应并完成

10、一定功能。使其响应并完成一定功能。v(2 2)程程序序中中的的一一切切操操作作都都是是通通过过向向对对象象发发送送消消息息来来实实现现的的,对对象象接接收收到到消消息息后后,启启动动有有关关方方法法完完成成相相应应的的操操作。作。向对象发送消息的形式如下:向对象发送消息的形式如下: 对象名对象名.成员函数名(实际参数表)成员函数名(实际参数表)面向对象的程序设计是一种新型的程序设计范型,其特征为:面向对象的程序设计是一种新型的程序设计范型,其特征为: 程序对象消息程序对象消息12v向向对对象象发发送送同同样样的的消消息息,有有可可能能执执行行不不同同的的代代码码 产产 生生 不不 同同 的的

11、效效 果果 , 这这 就就 是是多多 态态 性性(polymorphismpolymorphism)。)。v类类的的使使用用除除了了用用来来定定义义对对象象完完成成各各种种功功能能以以外外,还还可可以以在在已已有有类类的的基基础础上上,再再增增加加一一些些其其它它属属性性 和和 行行 为为 , 派派 生生 出出 新新 的的 类类 , 即即 利利 用用继继承承(inheritanceinheritance)机机制制形形成成父父类类与与子子类类的的类类层层次次关关系系;也也可可以以在在定定义义一一个个新新类类时时将将已已定定义义过过的的类的对象作为新类的数据成员,这是类的类的对象作为新类的数据成员

12、,这是类的组合组合。 因因此此,面面向向对对象象程程序序设设计计中中最最突突出出的的特特征征是是“抽抽象象性性、封封装装性性、继继承承性性和和多多态态性性”,最最重重要要的的概概念念是是类类和和对对象象,面面向向对对象象的的程程序序设设计就是围绕类的定义和类的使用展开的。计就是围绕类的定义和类的使用展开的。131.21.2面向对象程序设计的基本特征面向对象程序设计的基本特征 1.2.11.2.1新的程序设计范型新的程序设计范型 程序设计范型是指设计程序的规范,程序设计范型是指设计程序的规范,模型和风格,它是一类程序设计语言的基模型和风格,它是一类程序设计语言的基础。础。 面面向向对对象象程程序

13、序设设计计是是一一种种新新型型的的程程序序设计范型。这种范型的主要特征是:设计范型。这种范型的主要特征是:程序程序=对象对象+消息消息14v需需要要说说明明的的是是,某某一一种种程程序序设设计计语语言言不不一一定定与与一一种种程程序序设设计计范范型型相相对对应应。实实际际上上存存在在有有具具备备两两种种或或多多种种范范型型的的程程序序设设计计语语言言,即混合型语言。即混合型语言。v例例如如C+C+就就不不是是纯纯粹粹的的面面向向对对象象程程序序设设计计范范型型,而而是是面面向向过过程程程程序序设设计计范范型型和和面面向向对对象象程程序序设设计计范范型型的的混混合合范范型型程程序序设设计计语语言

14、。言。151.2.21.2.2面向对象程序设计的基本概念面向对象程序设计的基本概念 在面向对象程序设计中,包括了对象、类、在面向对象程序设计中,包括了对象、类、封装、继承、消息传递和多态性等基本概念。封装、继承、消息传递和多态性等基本概念。 1. 1. 对象(对象(objectobject) 现实世界中的对象,具有以下特性:现实世界中的对象,具有以下特性:(1 1)每一个对象必须有一个名字以区别与其他对象。)每一个对象必须有一个名字以区别与其他对象。(2 2)用属性来描述他的某些特征。)用属性来描述他的某些特征。(3 3)有一组操作,每个操作决定对象的一种行为。)有一组操作,每个操作决定对象的

15、一种行为。(4 4)对对象象的的操操作作可可以以分分为为两两类类:一一类类是是自自身身所所承承受受的的操操作,一类是施加于其他对象的操作。作,一类是施加于其他对象的操作。162. 2. 类(类(classclass) 具有相似属性和行为的一组对象,就称为类。具有相似属性和行为的一组对象,就称为类。 也就是说,类是对具有相同数据结构和相同操作的一类也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。对象的描述。v类实质上就是一种类型,但这种类型与一般类型不同。类实质上就是一种类型,但这种类型与一般类型不同。类包括数据成员和成员函数。类包括数据成员和成员函数。 v类和对象之间的关系是抽象和

16、具体的关系。类是多个对类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。象进行综合抽象的结果,一个对象是类的一个实例。v在面向对象程序设计中,总是先声明类,再由类生成其在面向对象程序设计中,总是先声明类,再由类生成其对象。类是建立对象的对象。类是建立对象的“模板模板”,按照这个模板所建立,按照这个模板所建立的一个个具体的对象,就是类的实际例子,通常称为实的一个个具体的对象,就是类的实际例子,通常称为实例。例。173. 3. 消息(消息(messagemessage)v消消息息是是一一个个对对象象向向另另一一个个对对象象发发出出的的执执行行某某种种操操

17、作作的的请请求求,而而对对象象执执行行操操作作称称为为对对消消息息的的响响应应。从从实实现现代代码码看看,消消息息就就是是通通过一个对象对类的成员函数的一次调用。过一个对象对类的成员函数的一次调用。v一一般般情情况况下下,我我们们称称发发送送消消息息的的对对象象为为发发送送者者或或请请求求者者,接接收收消消息息的的对对象象为为接接收收者者或或目目标标对对象象。对对象象中中的的联联系系智智能能通通过过消消息息传传递递来来进进行行。接接收收对对象象只只有有在在接接收收到到消消息息时时,才才能能被被激激活活,被被激激活活的的对对象象会会根根据据消消息的要求完成相应的功能。息的要求完成相应的功能。18

18、 消息具有以下消息具有以下3 3个性质:个性质:v同同一一个个对对象象可可以以接接收收不不同同形形式式的的多多个个消消息息,给出不同的响应。给出不同的响应。v相相同同形形式式的的消消息息可可以以传传递递给给不不同同的的对对象象,所给出的响应可以是不同的。所给出的响应可以是不同的。v消消息息的的响响应应并并不不是是必必需需的的,对对象象可可以以响响应应消息,也可以不响应。消息,也可以不响应。194. 4. 方法(方法(MethodMethod) v在面向对象程序设计中,要求某一对象做在面向对象程序设计中,要求某一对象做某一操作时,就向该对象发送一个相应的某一操作时,就向该对象发送一个相应的消息,

19、当对象接收到发向他的消息时,就消息,当对象接收到发向他的消息时,就调用有关的方法,执行相应的操作。调用有关的方法,执行相应的操作。 v方法就是对象能执行的操作。方法包括界方法就是对象能执行的操作。方法包括界面和方法体两部分。方法的界面也就是消面和方法体两部分。方法的界面也就是消息的模式,他给出了方法的调用协议;方息的模式,他给出了方法的调用协议;方法体则是体现某种操作的一系列计算步骤,法体则是体现某种操作的一系列计算步骤,也就是一段程序。也就是一段程序。 20v消消息息和和方方法法的的关关系系是是:对对象象根根据据接接收收到到的的消消息息,调调用用相相应应的的方方法法;反反过过来来,有有了了方

20、方法法,对对象象才才能能响响应应相相应应的的消消息息。所所以以消消息息模模式式与与方方法法界界面面应应该该是是一一致致的的。同同时时,只只要要方方法法界界面面保保持持不不变变,方方法法体体的的改改动动不不会会影响方法的调用。影响方法的调用。v在在C+C+语语言言中中方方法法是是通通过过函函数数来来实实现现的的,称为成员函数。称为成员函数。211.2.31.2.3面向对象程序设计的基本特征面向对象程序设计的基本特征 本节将介绍面向对象程序设计的本节将介绍面向对象程序设计的4 4个基本特征。个基本特征。 1. 1. 抽象性(抽象性(abstractionabstraction) v抽象是通过特定的

21、实例(对象)抽取共同性质抽象是通过特定的实例(对象)抽取共同性质以后形成概念的过程。抽象是对系统的简化描以后形成概念的过程。抽象是对系统的简化描述或规范说明,他强调了系统中的一部分细节述或规范说明,他强调了系统中的一部分细节和特性,而忽略了其他部分。和特性,而忽略了其他部分。v抽象包括两个方面:数据抽象和行为抽象。抽象包括两个方面:数据抽象和行为抽象。 222. 2. 封装性封装性( (encapsulation)encapsulation) v封封装装是是指指把把数数据据和和现现实实操操作作的的代代码码集集中中起起来来放放在在对对象象内内部部,并并尽尽可可能能隐隐蔽蔽对对象象的的内内部部细细

22、节节。对对象象好好像像是是一一个个不不透透明明的的黑黑盒盒子子,表表示示对对象象属属性性的的数数据据和和实实现现各各个个操操作作的的代代码码都都被被封封装装在在黑黑盒盒子子里里,从从外外面面是是看看不不见见的的,更更不不能能从从外外面面直直接接访访问问或或修修改改这这些些数数据据及及代代码码。使使用用一一个个对对象象的的时时候候,只只需需知知道道对对象象向向外外界界提提供供的的接接口口形形式式而而无无需需知知道道对对象象的的数数据据结结构构细细节节和和现现实实操操作作的的算法。算法。23v从从上上面面的的叙叙述述可可以以看看出出,封封装装应应该该具具有有下下面的几个条件:面的几个条件: (1

23、1)对对象象具具有有一一个个清清楚楚的的边边界界,对对象象的的私私有数据和实现操作的代码都被封装在内。有数据和实现操作的代码都被封装在内。 (2 2)具具有有一一个个描描述述对对象象与与其其他他对对象象如如何何相相互互作作用用的的接接口口,该该接接口口必必须须说说明明消消息息传传递递的使用方法。的使用方法。 (3 3)对对象象内内部部的的代代码码和和数数据据应应受受到到保保护护,其他对象不能直接修改。其他对象不能直接修改。243. 3. 继承性(继承性(InheritanceInheritance)v 在面向对象程序设计中,允许在已有类在面向对象程序设计中,允许在已有类的基础上通过增加新特征而

24、派生出新的类,的基础上通过增加新特征而派生出新的类,这称为继承。这称为继承。 v其原有的类称为基类其原有的类称为基类( (Base class )Base class ),而而新建立的类称为派生类(新建立的类称为派生类(Derived classDerived class)。例如,车是一个类,而小轿车就是车的一个派生类,例如,车是一个类,而小轿车就是车的一个派生类,奥迪小轿车又是小轿车的一个派生类。奥迪小轿车又是小轿车的一个派生类。 254. 4. 多态性(多态性(PolymorphismPolymorphism) v面面向向对对象象系系统统的的多多态态性性是是指指不不同同的的对对象象收收到相

25、同消息时产生多种不同的行为方式。到相同消息时产生多种不同的行为方式。v例例如如,我我们们有有一一个个窗窗口口windowwindow类类对对象象,还还有有一一个个棋棋子子piecepiece类类对对象象,现现在在我我们们来来考考虑虑对对他他们们都都发发出出“移移动动”的的消消息息,“移移动动”操操作作在在windowwindow类类对对象象和和piecepiece类类对对象象上上可以有不同的行为。可以有不同的行为。26vC+C+语语言言支支持持两两种种多多态态性性,即即编编译译时时的的多多态态性性和和运运行行时时的的多多态态性性。编编译译时时的的多多态态性性是是通通过过重重载载来来实实现现的的

26、,运运行行时时的的多多态态性性是是通过虚函数来实现。通过虚函数来实现。27v重载一般包括函数重载和运算符重载。重载一般包括函数重载和运算符重载。函函数数重重载载是是指指一一个个标标识识符符可可同同时时用用于于多多个个函函数数命命名名,而而运运算算符符重重载载是是指指一一个个运运算算符符可可同同时时用用于于多多种种运运算算。也也就就是是说说,相相同同名名字字的的函函数数或或运运算算符符在在不不同同的的场场合合可可以以表表现现出出不不同同的的行为。行为。多多态态性性增增强强了了软软件件的的灵灵活活性性和和重重用用性性,为为软软件件的的开开发发与与维维护护提提供供了了极极大大的的便便利利。尤尤其其是

27、是采采用用了了虚虚函函数数和和动动态态联联编编机机制制后后允允许许用用户户以以更更为为明确、易懂的方式去建立通用的软件。明确、易懂的方式去建立通用的软件。281.31.3面向对象程序设计的语言面向对象程序设计的语言 下下面面简简单单介介绍绍几几种种典典型型的的面面向向对对象象程程序序设设计计语言。语言。(1)smalltalk语言语言(2)simula语言语言(3)C+语言语言(4)java语言语言291.4C+程序及其开发程序及其开发 vC+程序的开发过程通常包括编辑、编译、程序的开发过程通常包括编辑、编译、连接、运行和调试等步骤。连接、运行和调试等步骤。vC+程序开发的集成开发环境:程序开

28、发的集成开发环境:Microsoft公司的公司的Visual C+Borland公司的公司的C+ BuilderIBM的的Visual Age C+301.4.1 Visual C+ 6.0集成开发环境简介集成开发环境简介 vMicrosoft公司公司1998年推出的功能强大的年推出的功能强大的IDE 。311.4.2 C+程序的开发过程程序的开发过程 321.4.3VisualC+6.0控制台应用程序开发控制台应用程序开发 C+C+控制台应用程序的具体步骤如下。控制台应用程序的具体步骤如下。(1) (1) 新新建建一一个个项项目目。在在Microsoft Microsoft Visual V

29、isual C+ C+ 6.06.0环环境境下下,所所有有应应用用程程序序都都包包含含在在一一个个项项目目中中,所所以以建建立立任任何应用程序的第一步需要建立一个项目。何应用程序的第一步需要建立一个项目。 选选择择【FileFile】【NewNew】命命令令(快快捷捷键键Ctrl+NCtrl+N),弹弹出出“New”New”对话框,选中对话框,选中“Project”Project”选项卡。选项卡。 在在 所所 列列 出出 的的 “项项 目目 ”中中 选选 择择 “Win32 Win32 Console Console Application”Application”项项目目(即即控控制制台台应

30、应用用程程序序),在在对对话话框框右右侧侧的的“Location”Location”和和“Project Project Name”Name”文文本本框框中分别输入路径和项目名称,单击中分别输入路径和项目名称,单击“OK”OK”按钮。按钮。33(2 2)进进入入“Win32 Win32 Console Console Application”Application”对对话话框框,选选择择“An An empty empty project”project”项项,表表示示选选择择空空项项目目,单单击击“Finish”Finish”按按钮钮,弹弹出出“New New Project Project

31、 Information”Information”对对话话框框,在在确确认认项项目目建建立立信信息息后后,单单击击“OK”OK”按钮,至此,完成新项目的建立。按钮,至此,完成新项目的建立。34(3 3)建立和编辑)建立和编辑C+C+源程序文件(即源程序文件(即. .cppcpp文件)。文件)。选择【选择【ProjectProject】【Add to ProjectAdd to Project】【NewNew】命令,选中命令,选中“File”File”选项卡,在选项卡,在“File”File”选项选项卡的项目中选择卡的项目中选择“C+ Source File”C+ Source File”项,并

32、在项,并在“File”File”文本框中输入源文件名,确认选择文本框中输入源文件名,确认选择“Add to project”Add to project”,单击单击“OK”OK”按钮将打开按钮将打开文件编辑器,可以输入并编辑文件编辑器,可以输入并编辑C+C+源程序代码。源程序代码。 35(4 4)建立和编辑)建立和编辑C+C+源程序头文件(即源程序头文件(即. .h h文件)。文件)。选选择择【ProjectProject】【Add Add to to ProjectProject】【NewNew】命命令令,选选中中“File”File”选选项项卡卡,在在“File”File”选选项项卡卡的的

33、项项目目中中选选择择“C/C+ C/C+ Header Header File”File”项项,并并在在“File”File”文文本本框框中中输输入入头头文文件件名名,确确认认选选择择“Add Add to to project”project”,单单击击“OK”OK”按按钮钮将将打打开开文文件件编编辑辑器,可以输入并编辑器,可以输入并编辑C+C+源程序头文件。源程序头文件。36(5 5)建立可执行文件。)建立可执行文件。选选择择【BuildBuild】【BuildBuild】命命令令(快快捷捷键键F7F7)即即可可建建立立可可执执行行程程序序,如如程程序序有有语语法法错错误误,则则在在屏屏幕

34、幕下下方方的的输输出出窗窗口口中中显显示示错错误信息。误信息。(6 6)选选择择【BuildBuild】【ExecuteExecute】命命令令,即即可运行程序。可运行程序。371.51.5本章小结本章小结 v本本章章介介绍绍了了面面向向对对象象程程序序设设计计的的一一些些基基本本概概念念、基基本本特特征征以以及及VC+ VC+ 6.06.0程程序序开开发发环环境境。重重点点内内容容概括如下。概括如下。1 1 面向过程与面向对象面向过程与面向对象2 2 面向对象程序设计的概念面向对象程序设计的概念:面面向向对对象象程程序序设设计计中中涉涉及及的的几几个个重重要要概概念念和和特特性性:类、对象、

35、封装、继承和多态。类、对象、封装、继承和多态。3 3 面向对象的程序设计语言面向对象的程序设计语言4 4 C+C+程序的开发程序的开发38第章第章C+语言基础语言基础本章要点:本章要点:v简单简单C+程序的结构程序的结构v基本数据类型的定义与运算符基本数据类型的定义与运算符v数据的输入与输出数据的输入与输出v内联函数、函数重载内联函数、函数重载v引用的概念与使用引用的概念与使用vnew和和deletev异常处理异常处理392.1C+语言概述语言概述 1.2 C+的产生与发展的产生与发展 2.1.1从从C到到C+ vC+语言是在语言是在C语言的基础上为支持面向对象程语言的基础上为支持面向对象程序

36、设计而研制的一种编程语言。序设计而研制的一种编程语言。 v1980年,贝尔实验室开始对年,贝尔实验室开始对C进行改进和扩充。进行改进和扩充。经过不断完善,成为目前的经过不断完善,成为目前的C+。 vC+包括了包括了C的全部特征和优点,同时又添加了的全部特征和优点,同时又添加了对面向对象编程(对面向对象编程(OOP)的完全支持。)的完全支持。40C+C+现现在在得得到到了了越越来来越越广广泛泛的的应应用用,它它继继承承了了C C语语言言的的优优点点,并并有有自自己己的的特特点点,最最主主要要的有:的有:(1 1)C+C+全全面面兼兼容容C C,这这就就使使许许多多C C代代码码不不经经修修改改就

37、就可可以以为为C+C+所所用用,用用C C编编写写的的众众多多的的函数库和使用软件可以用于函数库和使用软件可以用于C+C+中。中。(2 2)用用C+C+编编写写的的程程序序可可读读性性更更好好,代代码码结结构构更更为为合合理理,可可直直接接地地在在程程序序映映射射问问题题空空间的结构。间的结构。(3 3)生生成成代代码码的的质质量量高高,运运行行效效率率仅仅比比汇汇编编语言代码段慢语言代码段慢10%-20%10%-20%。41(4 4)从从开开发发时时间间、费费用用到到形形成成软软件件的的可可重重用用性性,可可扩扩充充性性,可可维维护护性性和和可可靠靠性性等等方方面面有有了了很很大大的的提提高

38、高,使使得得大大中中型型的的程程序序开开发发项目变得容易的多。项目变得容易的多。(5 5)支支持持面面向向对对象象的的机机制制,可可方方便便地地构构造造出出模拟现实问题的实体和操作。模拟现实问题的实体和操作。422.1.2一个简单的一个简单的C+程序程序 【例【例2.12.1】在屏幕上打印输出一行字符串的】在屏幕上打印输出一行字符串的程序。程序。/*02_01.cpp*/#include/包含标准输入输出头包含标准输入输出头文件文件iostreamusingnamespacestd;/引入引入C+C+标准命名空标准命名空间名间名stdstdintmain()cout“WelcometoC+!”

39、endl;/屏幕打印输出屏幕打印输出“Welcome to Welcome to C+!C+!return0;/程序成功返回程序成功返回43WelcometoC+!44说明:说明: (1)C+源源程程序序的的扩扩展展名名为为.cpp,而而C源源程程序序的的扩扩展展名是名是.c。(2)头文件:头文件:v示例中的示例中的#include为为C+的预处理指的预处理指令令,它告诉它告诉C+编译器在程序中要包括编译器在程序中要包括C+标准标准输入输出流头文件。输入输出流头文件。v从从C继承的继承的“.h”库仍然可用。在库仍然可用。在C源文件名前源文件名前加字母加字母c,如如include在在C+程序中可

40、程序中可写为写为#include。v有关有关头文件的内容我们将在后续章节头文件的内容我们将在后续章节中介绍。中介绍。45(3)命名空间:命名空间:v标准标准C+引入了一个可以由程序员命名的作用引入了一个可以由程序员命名的作用域,即命名空间域,即命名空间(namespace)。v在每一个命名空间中可将一些相关的实体(如在每一个命名空间中可将一些相关的实体(如变量、函数、对象、类等)放入其中,以解决变量、函数、对象、类等)放入其中,以解决程序中常见的同名冲突问题。程序中常见的同名冲突问题。vstd为为C+标准类库的一个命名空间名,其中存标准类库的一个命名空间名,其中存放了放了C+标准库中所定义的各

41、种实体名。标准库中所定义的各种实体名。v程序中的程序中的usingnamespacestd;语句称为语句称为using指令,它将指令,它将std命名空间中的实体名的作用域引命名空间中的实体名的作用域引入到该程序中。入到该程序中。46(4) (4) main() main() 函数:函数:vC+C+中中,main()main()总总是是返返回回intint类类型型。在在标标准准C+C+中中,返回类型不能省略。返回类型不能省略。vreturn return 0 0 向向操操作作系系统统返返回回数数值值0 0,否否则则返返回回数数值值1 1。(5) (5) 程序的注释:程序的注释:v在在C C语语言

42、言中中,我我们们用用“/*”“/*”及及“*/”“*/”作作为为注注释释分分界符号,例如:界符号,例如:/* /* this is a test */this is a test */vC+C+除除了了保保留留了了这这种种注注释释方方式式外外,还还增增加加了了一一种种以以“/”“/”开开头头的的单单行行注注释释方方式式,该该注注释释以以“/”“/”开始,到行尾结束。开始,到行尾结束。v/*.*/*.*/方方式式的的注注释释不不能能嵌嵌套套,但但它它可可以以嵌嵌套套/方式的注释。方式的注释。47(6) (6) 输入输入/ /输出:输出:vC+C+源源程程序序中中用用cincin和和coutcou

43、t是输入运算符,是输入运算符,是输出运算符。是输出运算符。 coutcoutcin变变量量; ; /表表示示从从流流对对象象cincin读读数数据据到到变变量中。量中。v流流对对象象cincin、coutcout及及运运算算符符的的定定义义,均均包包含含在在文文件件iostream.hiostream.h中中。这这就就是是程程序序的的开开始始要要有有# #includeinclude的原因。的原因。482.1.3名字空间名字空间 C+语言提供语言提供名字空间名字空间(namespace)防止命防止命名冲突。名冲突。1.名字空间的定义名字空间的定义namespace名字空间名称名字空间名称;关于

44、名字空间定义的说明:关于名字空间定义的说明:v定定义义名名字字空空间间以以关关键键字字namespace开开头头,名名字字空空间名称是合法的用户自定义标识符。间名称是合法的用户自定义标识符。v以以一一对对大大括括号号括括起起该该名名字字空空间间的的开开始始和和结结束束处处,右右大括号后面不加分号。大括号后面不加分号。v在在名名字字空空间间以以外外声声明明或或定定义义的的任任何何实实体体,都都可可以以出出现在名字空间内。现在名字空间内。 492. 2. 名字空间中内容的使用名字空间中内容的使用 v方法一:在需要使用名字空间中内容时用下面的形式:方法一:在需要使用名字空间中内容时用下面的形式:名字

45、空间名称名字空间名称:局部内容名局部内容名 v方法二:在使用该内容之前用:方法二:在使用该内容之前用:using namespace using namespace 名字空间名称;名字空间名称; v方法三:方法三:using using 名字空间名称名字空间名称:局部内容名;局部内容名;50【例【例2.2】关于名字空间的主要用法示例。关于名字空间的主要用法示例。/*02_02.cpp*/#includeusingnamespacestd;/using声明使用一个完整的名声明使用一个完整的名字空间字空间std/C+中中提提供供的的名名字字空空间间std涵涵盖盖了了所所有有标标准准C+的的定义和声

46、明定义和声明namespaceone/定义一个名字空间定义一个名字空间one,有有M和和infconstintM=200;intinf=10;/后面不加分号后面不加分号namespacetwo/定定义义一一个个名名字字空空间间two,有有x和和infintx;intinf=-100;/后面不加分号后面不加分号51usingnamespaceone;/using声明使用一个完整的名字空声明使用一个完整的名字空间间oneintmain()usingtwo:x;/using声明仅使用声明仅使用two中的中的xx=-100;/直接访问,相当于直接访问,相当于two:x=-100;coutinfendl

47、;/直接使用直接使用one中所有成员中所有成员coutMendl;two:inf*=2;/使用名字空间名使用名字空间名:局部内容名,操作未使用局部内容名,操作未使用using声明的声明的内容内容couttwo:infendl;/同样是同样是two中的内容,但是访问方式不一中的内容,但是访问方式不一样样coutxy)returnx;elsereturny;71(3)全局变量)全局变量v在在所所有有函函数数体体的的外外部部定定义义的的变变量量,其其作作用用范范围围是是整整个个程程序序,并并在在整整个个程程序序运运行行期期间间有效。有效。v在在C+语语言言中中,通通过过在在同同名名变变量量前前加加上

48、上域域解解析析符符“:”对对被被隐隐藏藏的的同同名名全全局局变变量量进行访问。进行访问。v这这样样,域域解解析析符符解解决决了了同同名名局局部部变变量量与与全全局局变变量量的的重重名名问问题题,提提供供了了一一种种在在同同名名局局部部变变量量的的作作用用域域内内访访问问同同名名全全局局变变量量的的方方法法,扩扩大大了了同同名名全全局局变变量量的的作作用用域域,使使全全局变量具有真正意义上的全局作用范围。局变量具有真正意义上的全局作用范围。 72【例【例2.3】局部变量随用随定义及用域解析符扩大】局部变量随用随定义及用域解析符扩大变量的作用域示例。变量的作用域示例。/*02_03.cpp*/#i

49、ncludeusingnamespacestd;/使用使用C+的标准名字空间的标准名字空间intsum=5050;/定义全局变量定义全局变量sumintmain()intarr3,i;/定义变量,但是定义变量,但是i的作用域为去掉第一个的作用域为去掉第一个for内的变量内的变量ifor(inti=0;iarri;intsum=0;/定义局部变量定义局部变量sum,与全局与全局sum同名,该函数内同名,该函数内/默认的默认的sum是该局部变量,其作用域到函数结束处是该局部变量,其作用域到函数结束处for(i=0;i3;i+)/此处的此处的i为函数开始处定义的为函数开始处定义的isum+=arri

50、;for(i=0;i3;i+)/此处的此处的i为函数开始处定义的为函数开始处定义的icoutarriendl;cout”局部局部sum=”sumendl;/输出局部输出局部sum变量的值变量的值:sum+=sum;/通过域解析符在同名局部变量的作用域内对全局通过域解析符在同名局部变量的作用域内对全局sum访问访问/赋值号右边的赋值号右边的sum为同名局部变量为同名局部变量cout”全局全局sum=”:sumendl;/输出全局输出全局sum变量的值变量的值coutreturn0;73运行程序,从键盘上输入:运行程序,从键盘上输入:123123局部局部sum=6全局全局sum=5056745 5

51、 constconst修饰符与指针的结合修饰符与指针的结合v在在定定义义指指针针时时,若若与与const修修饰饰符符结结合合在在一一起起使使用用,根根据据const出出现现的的次次数数及及二二者者位位置置关关系系的的不不同同,可可以以定定义义3种种不不同同的的指指针针指指向向常常量量的的指指针针、常常指指针针、指指向向常常量的常指针。量的常指针。(1)指向常量的指向常量的 指针指针 定义形式:定义形式:const类型名类型名*指针名;指针名; 例如:例如:intx=5;constint*p;p=&x;75(2) (2) 常指针常指针 定义形式:定义形式:类型名类型名*const指针名指针名=地

52、址值;地址值; 例如:例如:intx=5;int*constp=&x;(3) (3) 指向常量的常指针指向常量的常指针 定义形式:定义形式:const类型名类型名*const指针名指针名=地址值;地址值; 例如:例如:intx=5;constint*constp=&x766. 6. 新增新增boolbool类型类型v为为了了更更方方便便地地处处理理逻逻辑辑值值,C+语语言言保保持持了了C语语言言用用0表表示示逻逻辑辑假假,非非0表表示示逻逻辑辑真真的用法,新增加了数据类型的用法,新增加了数据类型bool: :用用常量常量true表示逻辑真。表示逻辑真。用用常量常量false表示逻辑假。表示逻辑

53、假。v所所有有的的关关系系运运算算、逻逻辑辑运运算算都都产产生生bool类型的结果值。类型的结果值。v可可以以使使用用C+标标准准库库提提供供的的boolalpha操操纵纵符符使使逻逻辑辑真真、逻逻辑辑假假输输出出为为true或或false,可可以以用用noboolalpha操操纵纵符符使使输输出恢复为出恢复为1或或0。77【例【例2.4】布尔型变量使用示例。布尔型变量使用示例。/*02_04.cpp*/#includeusingnamespacestd;voidmain()boolf=12;coutfboolalphafnoboolalphafendl; 1true1786.新增新增stri

54、ng类型类型vC+语言新增加了语言新增加了string类型来代替类型来代替C语语言中以言中以0结尾的结尾的char类型数组。使类型数组。使用用string类型必须包含头文件类型必须包含头文件string,string类型实际上封装字符串数据的容类型实际上封装字符串数据的容器类。器类。v 优点:有了优点:有了string类型,程序员无需关类型,程序员无需关心内存如何分配,也无需处理复杂的心内存如何分配,也无需处理复杂的0结束字符,这些操作将由系统自动结束字符,这些操作将由系统自动完成。完成。vString类型提供的操作:赋值、读写、类型提供的操作:赋值、读写、求串长、字符串联结、修改、比较、查找

55、求串长、字符串联结、修改、比较、查找等。等。797.枚举类型枚举类型v在在C语语言言中中以以如如下下方方式式声声明明一一个个枚枚举举类类型型WEEK并定义一个该类型的变量并定义一个该类型的变量w:enumWEEKSun,Mon,Tue,Wed,Thu,Fri,Sat;enumWEEKw;v在在C+语语言言中中直直接接用用WEEKw;定定义义,无无需需要要再写再写enum。v用匿名用匿名enum来定义符号常量,例如:来定义符号常量,例如:enumMin=0,Max=100; 这这样样Min、Max成成为为常常量量,定定义义intx=Min,arrMax;合法。合法。808.无名联合无名联合v无无

56、名名联联合合是是C+语语言言中中一一种种特特殊殊的的联联合合,它它在在关关键键字字union后后没没有有给给出出联联合合体体的的类类型型名名称称,这这样样做做可可以以使使一一组组变变量量共共享享同同一一段段内内存存空空间间,起起始地址相同。例如,始地址相同。例如,unioncharc; inti;doubled;v在在此此无无名名联联合合中中,变变量量c、i、d具具有有相相同同的的起起始始地址。地址。v无无名名联联合合可可通通过过使使用用其其中中数数据据项项名名字字直直接接存存取取数据,例如:数据,例如:i=0;c=A;d=21.8; 都是正确的,这与在都是正确的,这与在C语言中必须通过语言中

57、必须通过联合体变联合体变量名量名.数据项名字数据项名字的操作方式不同。的操作方式不同。 81扩展了的结构体类型扩展了的结构体类型 C+语语言言的的结结构构体体类类型型与与C语语言言结结构构体体类类型型有有两两个个区区别:别:(1)在在C+语语言言中中定定义义结结构构体体类类型型时时,struct后后面面的的标标识识符符可可以以直直接接作作为为该该结结构构体体类类型型的的类类型型名,例如:名,例如:structPointdoublex,y;Pointp; /在在C+语语言言中中Point可可作作为为类类型型structPointp;/在在C语言中必须这样写语言中必须这样写82(2)C+语语言言的

58、的结结构构体体中中不不仅仅包包含含了了数数据据成成员员,还还可可以以将将对对这这些些数数据据成成员员进进行行操操作作的的成成员员函函数数也也定定义义在在结结构构体体内内,体体现现了了数数据据与与对对数数据据的的操操作作不不分分离离的的思思想想,这这也也是是面面向向对对象象程程序序设设计计的的基基础,例如:础,例如:structPointdoublex,y;/数据成员数据成员voidSetVal(doublea,doubleb)x=a;y=b;/成员函数成员函数p;/结构体变量结构体变量语句:语句:p.SetVal(2.3,5.8);其作用等同于:其作用等同于:p.x=2.3;p.y=5.8;8

59、310.void型指针型指针 vvoid通通常常表表示示无无值值,但但将将void作作为为指指针针的的类类型型时时,它它却却表表示示不不确确定定的的类类型型。这这种种void型型指指针针是是一一种种通通用用型型指指针针,也也就就是是说说任任何何类类型型的的指指针针值值都都可可以以赋赋给给void类类型的指针变量。型的指针变量。v例如下面的程序段:例如下面的程序段:voidpa;void*pc;inti=456;charc=a;pc=&i;pc=&c;84v需要指出的是,这里说需要指出的是,这里说void型指针是通型指针是通用型指针,是指它可以接收任何类型的指用型指针,是指它可以接收任何类型的指

60、针的赋值,但对已获值的针的赋值,但对已获值的void型指针,型指针,对它在进行处理,如输出或传递指针值时,对它在进行处理,如输出或传递指针值时,则必须再进行显示类型转换,否则会出错。则必须再进行显示类型转换,否则会出错。 85【例【例2.5】void型指针的使用。型指针的使用。 /*02_05.cpp*/#includeusingnamespacestd;intmain()void*pc;inti=456;charc=a;pc=&i;cout*(int*)pcendl;pc=&c;cout*(char*)pc算算术术运运算算符符关关系系运运算算符符逻逻辑辑运运算算符符条件运算符条件运算符赋值运

61、算符赋值运算符88表表2.4C+中运算符的优先级和结合性中运算符的优先级和结合性优先级运算符结合性1:自左至右2( ) . .* *自左至右3! + - sizeof new delete 自右至左4* %自左至右5+ 自左至右6自左至右7 =自左至右8= !=自左至右9&自左至右10自左至右11|自左至右12&自左至右13|自左至右14?:自右至左15= += -= *= /= %= = &= = |=自右至左16throw自右至左17,自左至右892.2.3数据类型转换数据类型转换 v当表达式中出现了多种类型数据的混合运当表达式中出现了多种类型数据的混合运算时,首先需要进行类型转换,其次再

62、计算时,首先需要进行类型转换,其次再计算表达式的值。算表达式的值。vC+允许不同基本类型的量混合参加运算,允许不同基本类型的量混合参加运算,因此,编程中我们常常需要进行类型之间因此,编程中我们常常需要进行类型之间的相互转换。的相互转换。 v类型转换分为:类型转换分为:隐式隐式的类型转换的类型转换显式显式的类型转换两种。的类型转换两种。 90【例【例2.6】隐式类型转换实例。】隐式类型转换实例。/*02_06.cpp/#includeusingnamespacestd;doublegt(floatx,floaty)/参参数数虚虚实实结结合合时时自自动动进进行行隐隐式式的的类类型转换型转换retu

63、rnxy?x:y;/将表达式值的类型进行隐式的类型转换将表达式值的类型进行隐式的类型转换intmain()inti=23,j=45,result;doubled;d=i;/进进行行隐隐式式类类型型转转换换,i转转换换为为double类类型型后后赋赋值值给给dresult=gt(i,j);/i,j转换成转换成float类型进行参数传递类型进行参数传递/gt(i,j)的结果为的结果为double类型,隐式类型转换后赋值给类型,隐式类型转换后赋值给resultcout”result=”resultendl;return0;91result=4592v所所谓谓显显式式,就就是是在在编编程程时时,我我们

64、们需需手手工工利利用这些操作符进行类型转换。用这些操作符进行类型转换。 vC+语语言言中中仍仍支支持持C语语言言中中的的类类型型转转换换形形式式,即:即:(目标类型名)待转换源数据(目标类型名)待转换源数据 例例如如:将将一一个个float型型的的值值转转换换为为int型型结结果果,可以使用如下格式进行转换:可以使用如下格式进行转换:floatf=100.23;intx=(int)f;93vC+语语言言提提供供了了另另一一种种更更为为方方便便类类似似于于函函数调用的转换方式:数调用的转换方式: 目标类型名(待转换源数据)目标类型名(待转换源数据) 上面的转换在上面的转换在C+语言中写成:语言中

65、写成: x=int(f);类型转换通过调用类型转换函数实现。类型转换通过调用类型转换函数实现。C+是是一一种种强强类类型型语语言言,类类型型由由低低向向高高的的转转换换一一般般是是安安全全的的、无无副副作作用用的的,反反之之可可能能导导致致不不期期望望的的结结果果或或错错误误。总总之之,类类型型转转换换在在编编程时应慎用。程时应慎用。942.3数据的输入与输出数据的输入与输出 2.3.1I/O的书写格式的书写格式 v在在C+语言中,数据的输入和输出是通过语言中,数据的输入和输出是通过I/O流来实现的,分别使用系统所提供的流来实现的,分别使用系统所提供的输入流对象输入流对象cin和输出流对象和输

66、出流对象cout来完成来完成的。的。v在使用过程中,只要在程序的开头嵌入相在使用过程中,只要在程序的开头嵌入相应的头文件应的头文件“iostream.h”即可。即可。95数据的输出数据的输出cout 输出流对象输出流对象cout输出数据语句的一般格式为:输出数据语句的一般格式为:cout数数据据1数数据据2数数据据n;说明:说明:(1)cout是是系系统统预预定定义义的的一一个个标标准准输输出出设设备备(一一般般代代表表显显示示器器);“变量名变量名1变量名变量名2变量名变量名n;说明:说明:(1)cin是是系系统统预预定定义义的的一一个个标标准准输输入入设设备备(一一般般代代表表键键盘盘);

67、“”是是输输入入操操作作符符,用用于于从从cin输输入入流流中中取取得得数数据据,并并将将取取得得的的数数据据传传送送给给其其后的变量,从而完成输入数据的功能。后的变量,从而完成输入数据的功能。(2)cin的的功功能能是是:当当程程序序在在运运行行过过程程中中执执行行到到cin时时,程程序序会会暂暂停停执执行行并并等等待待用用户户从从键键盘盘输输入入相相应应数数目目的的数数据据,用用户户输输入入完完数数据据并并回回车车后后,cin从从输输入入流流中中取取得得相相应应的的数数据据并并传传送送给给其其后后的的变量。变量。97(3)“”操操作作符符后后除除了了变变量量名名外外不不得得有有其其他数字、

68、字符串或字符,否则系统会报错。他数字、字符串或字符,否则系统会报错。(4)cin后后面面所所跟跟的的变变量量可可为为任任何何数数据据类类型型,若若变变量量为为整整型型数数据据类类型型,则则在在程程序序运运行行过过程程中中从从键键盘盘输输入入数数据据时时,可可分分别别按按十十进进制制、八进制或十六进制格式输入该整数。八进制或十六进制格式输入该整数。(5)当当程程序序中中用用cin输输入入数数据据时时,最最好好在在该该语语句句之之前前用用cout输输出出一一个个需需要要输输入入数数据据的的提提示示信信息息,以以正正确确引引导导和和提提示示用用户户输输入入正确的数据。正确的数据。(6)当当一一个个c

69、in后后面面同同时时跟跟有有多多个个变变量量时时,则则用用户户输输入入数数据据的的个个数数应应与与变变量量的的个个数数相相同同,各各数数据据之之间间用用一一个个或或多多个个空空格格隔隔开开,输输入入完完毕毕后后按按回回车车键键;或或者者,每每输输入入一一个个数据按回车键也可。数据按回车键也可。982.3.2简单的简单的I/O格式控制格式控制 vC+的的I/O流类库提供了一些控制符,可流类库提供了一些控制符,可以直接嵌入到输入以直接嵌入到输入/输出语句中来实现输出语句中来实现I/O格式控制。格式控制。v使用格式控制符首先必须在源程序的开头使用格式控制符首先必须在源程序的开头包含包含iomanip

70、.h。 v表表2.5中中列列出出了了几几个个常常用用的的I/O流流类类库库格格式控制符。式控制符。99表表2.5常用的常用的I/O流控制符流控制符 控制符含义dec数值数据采用十进制hex数值数据采用十六进制oct数值数据采用八进制ws提取空白符endl插入换行符,并刷新流ends插入空字符setfill(c)在给定的输出域宽度内填充字符csetprecision(int)设置浮点数的小数位数(包括小数点)setw(int)设置域宽setiosflags(ios:left)左对齐setiosflags(ios:scientific)指数显示100在使用在使用setw(n)是要注意:是要注意:(

71、1)如如一一个个输输出出量量需需要要比比setw(n)确确定定的的字字符符数数更更多多的的字字符符,则则该该输输出出量量将将使使用用它它所所需需要要的的宽宽度度。例如:例如:floatsum=3.12345;coutsetw(4)sumendl; 其运行结果为:其运行结果为:3.12345 它并不按位宽度,而是按实际跨度输出。它并不按位宽度,而是按实际跨度输出。(2) setw(n)仅仅仅仅影影响响下下一一个个数数值值输输出出,使使用用setw设置的间隔方式并不保留其效力。例如:设置的间隔方式并不保留其效力。例如:cout200setw(8)400600endl; 其运行结果为:其运行结果为:

72、200400600 运运行行结结果果中中600并并没没有有按按宽宽度度输输出出。Setw()的的默默认认宽宽度为度为0,意思是按输出数值表示的宽度输出。,意思是按输出数值表示的宽度输出。1012.4C+中函数的新特性中函数的新特性 2.4.1函数的原型函数的原型 C+中函数原型声明的形式为:中函数原型声明的形式为:函数返回值类型函数返回值类型函数名(形式参数表);函数名(形式参数表);对函数的原型声明,作以下几点说明:对函数的原型声明,作以下几点说明:v函函数数原原型型最最简简单单的的声声明明方方法法是是将将函函数数定定义义的的首首部复制到调用点之前,然后在最后加一个分号部复制到调用点之前,然

73、后在最后加一个分号。102v函函数数返返回回值值类类型型建建议议都都要要给给定定,若若一一个个函函数数没没有有返返回回值值,则则必必须须在在原原型型声声明明中中声声明明其返回值类型为其返回值类型为void。v函函数数原原型型参参数数表表中中必必须须指指明明形形式式参参数数的的个个数和类型,形式参数名可以省略。数和类型,形式参数名可以省略。v 先先定定义义后后被被调调用用的的函函数数以以及及main函函数数无无需作原型声明。需作原型声明。 1032.4.2默认参数的函数默认参数的函数 v一般情况下,实参个数应该与形参个数相一般情况下,实参个数应该与形参个数相同,但同,但+允许实参个数与形参个数不

74、同。允许实参个数与形参个数不同。v方法是在说明函数原型时,为一个或多个方法是在说明函数原型时,为一个或多个形参指定缺省值,以后调用此函数时,若形参指定缺省值,以后调用此函数时,若省略其中某一实参,省略其中某一实参,C+自动地以缺省值自动地以缺省值作为相应参数的值。作为相应参数的值。 intinit(intx=5,inty=10); 则则x与与y的缺省值分别为的缺省值分别为5和和10。104v当当进进行行函函数数调调用用时时,编编译译器器按按从从左左向向右右顺顺序序将将实实参参和和形形参参结结合合,若若未未指指定定足足够够的的实实参参,则则编编译译器器按按顺顺序序调调用用函函数数原原型型中中的的

75、缺缺省省值值来来补补足足所所缺缺少少的的实实参参。例例如如以下的函数调用都是允许的。以下的函数调用都是允许的。init(100,80);/x=100,y=80init(25);/x=25,y=10init(10);/x=5,y=10105说明:说明: (1)在在函函数数原原型型中中,所所有有取取缺缺省省值值的的参参数数都都必必须须出出现现在在不不缺缺省省值值的的参参数数的的右右边边。亦亦即即,一一旦旦开开始始定定义义取取缺缺省省值值的的参参数数,就就不不可可以以在说明非缺省的参数。例如:在说明非缺省的参数。例如:intfun(inti,intj=5,intk); 是是错错误误的的,因因为为在在

76、取取缺缺省省值值参参数数的的intj=5后,不应再说明非缺省参数后,不应再说明非缺省参数intk。若改为:若改为:int fun(inti, int k, int j=5); 就正确了就正确了106(2)在在函函数数调调用用时时,实实际际参参数数提提供供的的顺顺序序应应该该是是从从左左到到右右依依次次提提供供,实实际际参参数数的的最最少少个个数数应应等等于于不不具具有有默默认认参参数数值值的的形形式式参参数数个个数。数。 若若某某个个参参数数省省略略,则则其其后后的的参参数数皆皆应应省省略略而而采采用用缺缺省省值值。不不允允许许某某个个参参数数省省略略后后,在给其后的参数指定参数值。在给其后的

77、参数指定参数值。 例例如如不不允允许许出出现现以以下下调调用用init()函函数数的的语句:语句: init(,20);107(3)如果制定了默认参数值的形式参数在调如果制定了默认参数值的形式参数在调用时又得到了实际参数,则实际参数值优用时又得到了实际参数,则实际参数值优先。在调用时如果不提供对应参数,形式先。在调用时如果不提供对应参数,形式参数才使用默认参数值。参数才使用默认参数值。 1082.4.3内联函数内联函数 v在在函函数数说说明明前前冠冠以以关关键键字字“inline”,该该函数就被声明为函数就被声明为内联函数内联函数。v每每当当程程序序中中出出现现对对该该函函数数的的调调用用时时

78、,C+编编译译器器使使用用函函数数体体中中的的代代码码插插入入到到调调用用该该函函数数的的语语句句之之处处,在在程程序序运运行行时时不不再再进进行行函数调用。函数调用。v为什么要引入内联函数呢?为什么要引入内联函数呢? 这这主主要要是是为为了了消消除除函函数数调调用用时时的的系系统统开开销销,以提高运行速度。以提高运行速度。109【例【例2.7】内联函数的使用。】内联函数的使用。 /*02_07.cpp*/#includeusingnamespacestd;inlinedoublecircle(doubler)return3.1416*r*r;intmain()for(inti=1;i=3;i

79、+)cout”r=”i”area=”circle(i)endl;return0; 110说明:说明:(1)内内联联函函数数在在第第一一次次被被调调用用之之前前必必须须进进行行声声明明或或定定义义,否否则则编编译译器器将将无无法法知知道道应应该该插插入入什什么么代代码码。因因此此,下下面面的的程程序序不不会会像像预计的那样被编译:预计的那样被编译:r=1area=3.1416r=2area=12.5664r=3area=28.274401111(2) C+的的内内联联函函数数具具有有与与C中中的的宏宏定定义义#define相相同同的的作作用用和和相相似似的的机机理理,但但消消除了除了#defin

80、e的不安全因素。的不安全因素。(3)内内联联函函数数体体内内一一般般不不能能有有循循环环语语句句和和开开关语句关语句。(4)后后面面章章节节讲讲到到的的类类结结构构中中所所有有在在类类说说明明体内定义的函数都是内联函数。体内定义的函数都是内联函数。 (5)使使用用内内联联函函数数是是一一种种用用空空间间换换时时间间的的措措施施,若若内内联联函函数数较较长长,且且调调用用太太频频繁繁时时,程程序序将将加加长长很很多多。因因此此,通通常常只只有有较较短短的的函函数数才才定定义义为为内内联联函函数数,对对于于较较长长的的函函数数最好作为一般函数处理。最好作为一般函数处理。1122.4.4函数重载函数

81、重载 v在在传传统统的的C语语言言中中,同同一一作作用用域域内内函函数数名名必必须须是是唯唯一一的的,也也就就是是说说不不允允许许出出现现同同名名的函数。的函数。v假假如如,要要求求编编写写求求整整数数,浮浮点点数数和和双双精精度度数数的的三三次次方方数数的的函函数数。若若用用C语语言言来来处处理理,必必须须编编写写3个个函函数数,这这3个个函函数数的的函函数数名名不不允许同名。允许同名。v例如:例如:icube(inti);/求整数的三次方求整数的三次方fcube(floatf);/求浮点数的三次方求浮点数的三次方dcube(doubled);/求双精度数的三次方求双精度数的三次方113v在

82、在C+中,用户可以中,用户可以重载函数重载函数。v这这意意味味着着,只只要要函函数数参参数数的的类类型型不不同同,或或者者参参数数的的个个数数不不同同,或或者者二二者者兼兼而而有有之之,两两个个或或两两个个以以上上的的函函数数可可以以使使用用相相同同的的函函数名数名。v当当两两个个以以上上的的函函数数共共用用一一个个函函数数名名,但但是是形形参参的的个个数数或或者者类类型型不不同同,编编译译器器根根据据实实参参和和形形参参的的类类型型及及个个数数的的最最佳佳匹匹配配,自自动动确定调用那一个函数,这就是函数的重载。确定调用那一个函数,这就是函数的重载。v被重载的函数称为被重载的函数称为重载函数重

83、载函数。114v由由于于C+支支持持函函数数重重载载,上上面面3个个求求三三次次方方数数的的函函数数可可以以起起一一个个共共同同的的名名字字cube,但它们的参数类型仍保留不同。但它们的参数类型仍保留不同。v当当用用户户调调用用这这些些函函数数时时,只只需需在在参参数数表表中中带带入入实实参参,编编译译器器就就会会根根据据实实参参的的类类型型来来确定到底调用哪个重载函数。确定到底调用哪个重载函数。v因因此此,用用户户调调用用求求三三次次方方数数的的函函数数时时,只只需需记记住住一一个个cube()函函数数,剩剩下下的的则则都都是系统的事情。是系统的事情。上述例子我们可以用下面的程序来实现。上述

84、例子我们可以用下面的程序来实现。115【例【例2.8】参数类型不同的重载函数。】参数类型不同的重载函数。 /*02_08.cpp*/#includeusingnamespacestd;intCube(inti)returni*i*i;floatCube(floatf)returnf*f*f;doubleCube(doubled)returnd*d*d;intmain()inti=12;floatf=3.4;doubled=5.67;couti*i*i=Cube(i)endl;coutf*f*f=Cube(f)endl;coutd*d*d=Cube(d)endl;return0;11612*12

85、*12=17283.4*3.4*3.4=39.3045.67*5.67*5.67=182.284117【例【例2.9】参数个数不同的重载函数。】参数个数不同的重载函数。 /*02_09.cpp*/#includeusingnamespacestd;intAdd(intx,inty)returnx+y;intAdd(intx,inty,intz)returnx+y+z; intmain()inta=3,b=4,c=5;couta+b=Add(a,b)endl;couta+b+c=Add(a,b,c)endl;return0;118说明:说明:(1)返回类型不再参数匹配检查之列。返回类型不再参数匹

86、配检查之列。 若若两两个个函函数数除除返返回回类类型型不不同同外外,其其他他均均相相同同,则则是非法的。是非法的。 例如:例如:intmul(intx,inty);doublemul(intx,inty);虽虽然然这这两两个个函函数数的的返返回回类类型型不不同同,但但是是由由于于参参数数个个数数和和类类型型完完全全相相同同,编编译译程程序序将将无无法法区区分分这这两两个个函函数数。因因为为在在确确定定调调用用哪哪一一个个函函数数之之前前,返返回类型是不知道。回类型是不知道。3+4=73+4+5=12119(2)函函数数的的重重载载与与带带缺缺省省值值的的函函数数一一起起使使用用时,有可能引起二

87、义性,例如:时,有可能引起二义性,例如: voidDrawCircl(intr=0;intx=0;inty=0);voidDrawCircle(intr);C+尽管提供重载,但当调用:尽管提供重载,但当调用:DrawCirclr(20);时,编译无法确定使时,编译无法确定使用哪一个函数。用哪一个函数。120(3)在在函函数数调调用用时时。如如果果给给出出的的实实参参和和形形参参类类型型不不相相符符,+的的编编译译器器会会自自动动做做类类型型转转换换工工作作。如如果果转转换换成成功功,则则程程序序继继续续执执行行,但但在在这这种种情情况下,有可能产生不可识别的错误。况下,有可能产生不可识别的错误

88、。例如,有两个函数的原型如下:例如,有两个函数的原型如下:voidf_a(intx);voidf_a(longx);虽虽然然这这两两个个函函数数满满足足函函数数重重载载的的条条件件,但但是是,如如果果我我们们用用intc=f_a(5.56);取取调调用用,就就会会出出现现不不可可分分辨辨的的错错误误。这这是是因因为为编编译译器器无无法法确确定定将将5.56转换成转换成int还是还是long类型的原因造成的。类型的原因造成的。1212.5引用引用 2.5.1引用的概念及使用引用的概念及使用 v引引用用(Reference)是是C+语语言言新新增增加加的的概概念念,用用来来为为变变量量起起别别名名

89、,它它主主要要用用作作函函数数参参数数以以及及作作为为函函数数的的返返回回值值类类型型,在在程程序中发挥着灵活的作用。序中发挥着灵活的作用。vC+是是通通过过引引用用运运算算符符&来来声声明明一一个个引引用用的的,在声明时,必须进行初始化。在声明时,必须进行初始化。 声明一个引用的格式如下:声明一个引用的格式如下:数据类型数据类型&引用名引用名=已定义的变量名;已定义的变量名;122例如:例如:inti=5;int&j=i;说明:说明:(1)在在以以上上声声明明引引用用的的格格式式中中,“&”不不是是取取地地址址符符,而而是是引引用用运运算算符符,只只在在声声明明一一个个引引用用时时使使用用,

90、以以后后引引用用就就像像普普通通变变量量一一样样使使用用,无无需需再再带带“&”符。符。(2)引用名为一个合法的用户自定义标识符。)引用名为一个合法的用户自定义标识符。(3)在在声声明明一一个个引引用用的的同同时时,如如果果不不是是作作为为函函数数的的参参数数或或返返回回值值类类型型,就就必必须须对对它它进进行行初初始始化化,以以明明确确该该引引用用是是哪哪一一个个变变量量的的别别名名,以以后后在在程程序中不可改变这种别名关系。序中不可改变这种别名关系。123(4)引引用用只只是是某某一一个个变变量量的的别别名名,系系统统不不为为引引用用另另外外分分配配内内存存空空间间,与与所所代代表表的的变

91、变量量占用同一内存。占用同一内存。(5)并并不不是是任任何何类类型型的的数数据据都都可可以以有有引引用用,不不能能建建立立void型型引引用用、引引用用的的引引用用、指指向引用的指针、引用数组。向引用的指针、引用数组。124【例【例2.10】引用的最基本用法示例。】引用的最基本用法示例。 /*02_010.cpp*/#includeusingnamespacestd;intx=5,y=10;int&r=x;/定义一个引用定义一个引用r作为变量作为变量x的别名的别名voidPrint()/定义一个专门用于输出的函数定义一个专门用于输出的函数coutx=xy=y;coutr=rendl;coutA

92、ddressofx&xendl;coutAddressofy¥dl;coutAddressofr&rendl;125intmain()Print();/第第1次调用输出函数次调用输出函数r=y;/相当于相当于x=y,将将y的值赋给的值赋给x,/而不是而不是r改变为变量改变为变量y的别名的别名y=100;/对对y重新赋值不会影响引用重新赋值不会影响引用r的值的值Print();/再次调用输出函数再次调用输出函数return0;126x=5y=10r=5Addressofx00474DD0Addressofy00474DD4Addressofr00474DD0x=10y=100r=10Add

93、ressofx00474DD0Addressofy00474DD4Addressofr00474DD01272.5.2引用作为参数传递引用作为参数传递 v在在C+语语言言中中,引引用用最最主主要要的的用用途途是是作作为为函函数数的的形形式式参参数数,在在函函数数被被调调用用时时引引用用成成为为实实在在参参数数变变量量在在被被调调函函数数中中的的别别名名,从从而而可可以以通通过过对对引引用用的的访访问问和和修修改改达达到到对对实实在在参参数数变变量量进进行行操操作作的的效效果果,为为对对实实在在参参数数变变量量的的访访问问和和修修改改提提供供了简单方便的途径。了简单方便的途径。v引引用用参参数数

94、使使得得实实在在参参数数变变量量的的作作用用域域“扩扩大大”到原先无法进入的被调函数中。到原先无法进入的被调函数中。vC+提提供供引引用用,其其主主要要的的一一个个用用途途就就是是将将引引用用作作为函数的参数。为函数的参数。128【例【例2.11】采用】采用“引用参数引用参数”传递函数参数。传递函数参数。 /*02_11.cpp*/#includeusingnamespacestd;voids,int&n)inttemp;temp=m;m=n;n=temp;intmain()inta=5,b=10;cout”a=”a”b=”bendl;s);/调调用用函函数数,参参数数传传递递相相当当于于执执

95、行行了了int&m=a;int&n=b;使使引引用用参数获得了初值参数获得了初值cout”a=”a”b=”bendl;return0;129A=5b=10A=10b=5130v将将形形式式参参数数设设为为引引用用参参数数,克克服服了了不不能能通通过过值值形形式式参参数数改改变变对对应应实实在在参参数数变变量量的的缺缺陷陷,因因为为引引用用参参数数与与对对应应实实参参变变量量共共享享内存。内存。v与与引引用用形形式式参参数数对对应应的的实实在在参参数数只只能能是是变变量,而不能是常量或表达式。量,而不能是常量或表达式。v在在无无需需改改变变对对应应实实在在参参数数变变量量值值时时,用用引引用用参

96、参数数仍仍然然比比用用值值形形式式参参数数更更高高效效,因因为为无需另外分配空间和进行传值操作。无需另外分配空间和进行传值操作。1312.5.3引用与指针的区别引用与指针的区别v引引用用与与指指针针,都都能能实实现现修修改改第第三三方方变变量量值值,因因此此有有一一种种观观点点认认为为“引引用用是是能能自自动动间间接接引引用用的的一一种种指指针针”,即即无无需需使使用用指指针针运运算算符符“*”就就可可以以得得到到或或修修改改一一个个变变量量的的值值。而而指指针针一一定定要要使使用用运运算算符符“*”来来得得到到或或修改指针所指向变量的值。修改指针所指向变量的值。v使使用用引引用用可可以以简简

97、化化程程序序,因因而而引引用用是是C+程序员的利器之一。程序员的利器之一。132【例【例2.12】采用】采用“指针参数指针参数”传递函数参数。传递函数参数。 /*02_12.cpp*/#includevoids*m,int*n)/系统要给系统要给m、n分配内存空间以存放实际参数地址分配内存空间以存放实际参数地址inttemp;temp=*m;*m=*n;*n=temp;intmain()inta=5,b=10;cout”a=”a”b=”bendl;s);/改写改写swap调用调用cout”a=”a”b=”bendl;return0;133A=5b=10A=10b=5v尽尽管管两两种种不不同同的

98、的形形式式参参数数下下都都可可以以实实现现对对实实参参变变量量a、b的的互互换换,但但是是引引用用参参数数的的效效率率更更高高,语语法法更更简简单单直直观观,因因为为系系统统要要给给指指针针形形式式参参数数分分配配内内存存空空间间以以存存放放实实际际参参数数地地址。址。vC+主主张张引引用用参参数数传传递递取取代代指指针针参参数数传传递递的的方方式式,因因为为前前者语法容易且不易出错者语法容易且不易出错。1342.5.4引用作为返回类型引用作为返回类型 v引用返回函数的原型声明形式为:引用返回函数的原型声明形式为:类型名类型名&函数名(形式参数表);函数名(形式参数表);v调用引用返回函数可以

99、作为:调用引用返回函数可以作为:独立的函数语句;独立的函数语句;表达式中的某一个运算对象;表达式中的某一个运算对象;作作为为左左值值(即即赋赋值值号号左左边边的的变变量量),这这是是引引用作为返回值的函数的一个主要用法;用作为返回值的函数的一个主要用法; 135【例【例2.13】引用作为函数返回类型示例。】引用作为函数返回类型示例。 /*02_13.cpp*/#includeusingnamespacestd;int&Fun(constint&x,int&y,intz)z+;y=x+y+z;returny;intmain()inta=1,b=2,c=3,d=0;cout”a=”a”b=”b”c

100、=”c”d=”dendl;Fun(a,b,c)=20;/这这是是引引用用返返回回的的函函数数特特有有的的调调用用方方式式,相相当当于于语语句句b=20;cout”a=”a”b=”b”c=”c”d=”dendl;136a=1b=2c=3d=0a=1b=20c=3d=0对于引用作为返回值的函数有几个特别的要求对于引用作为返回值的函数有几个特别的要求 :(1) (1) returnreturn后后面面只只能能是是变变量量(引引用用也也理理解解为为一一种种特特殊殊的的变变量量),而而不不能能是常量或表达式,因为只有变量才能作为左值使用。是常量或表达式,因为只有变量才能作为左值使用。(2) (2) re

101、turnreturn后后面面变变量量的的内内存存空空间间在在本本次次函函数数调调用用结结束束后后应应当当仍仍然然存存在在,因此局部自动型变量不能作为引用返回。因此局部自动型变量不能作为引用返回。(3) (3) returnreturn后后面面返返回回的的不不能能是是常常引引用用,因因为为常常引引用用是是为为了了保保护护对对应应的的实实在在参参数数变变量量不不被被修修改改,而而引引用用返返回回的的函函数数作作为为左左值值必必定定要要引引起起变变量量的的修修改。改。 1372.6动态内存分配动态内存分配 2.6.1动态内存分配与释放函数动态内存分配与释放函数 v我我们们知知道道,程程序序运运行行时

102、时,计计算算机机的的内内存存被被分分为为4个区:个区:程序代码区程序代码区全程数据区全程数据区栈栈堆堆v其中堆可由用户分配和释放。其中堆可由用户分配和释放。vC语语言言中中使使用用函函数数malloc()和和free()等等来来进进行动态内存管理。行动态内存管理。v并并在在程程序序的的头头部部嵌嵌入入相相应应的的头头文文件件:#include。1381.malloc函数函数v其函数原型如下其函数原型如下:void*malloc(unsignedintsize);v其其作作用用是是在在内内存存的的动动态态存存储储区区中中分分配配一一个个长长度度为为size的连续空间。的连续空间。v此此函函数数的

103、的值值(即即“返返回回值值”)是是一一个个指指向向分分配配域起始地址的指针(基类型为域起始地址的指针(基类型为void)。)。v如如果果此此函函数数未未能能成成功功地地执执行行(例例如如内内存存空空间间不不足),则返回空指针(足),则返回空指针(NULL)。)。139例如:例如:int*p;p=(int*)malloc(sizeof(int);student*ps;ps=(student*)malloc(sizeof(student);1402.calloc函数函数v其函数原型如下其函数原型如下:void*calloc(unsignedn,unsignedsize);v其其作作用用是是在在内内

104、存存的的动动态态区区存存储储中中分分配配n个个长长度度为为size的的连连续续空空间间。函函数数返返回回一一个个指指向向分分配配域域起起始地址的指针;如果分配不成功,返回始地址的指针;如果分配不成功,返回NULL。v用用calloc函函数数可可以以为为一一维维数数组组开开辟辟动动态态存存储储空空间,间,n为数组元素个数,每个元素长度为为数组元素个数,每个元素长度为size。1413.free函数函数v其函数原型如下:其函数原型如下:voidfree(void*p);v其其作作用用是是释释放放由由p指指向向的的内内存存区区,使使这这部部分内存区能被其他变量使用。分内存区能被其他变量使用。vp是是

105、最最近近一一次次调调用用calloc或或malloc函函数数时返回的值,时返回的值,free函数无返回值。函数无返回值。1422.6.2new和和delete vC+则则提提供供了了操操作作符符new和和delete来来做做同同样样的的工工作作,而而且且后后者者比比前前者者性性能能更更优优越越,使使用用更更方方便灵活。便灵活。1.newv运算符运算符new用于内存分配的最基本的语法形式:用于内存分配的最基本的语法形式:指针变量指针变量=new类型名;类型名;v该该语语句句在在程程序序运运行行过过程程中中从从称称为为堆堆的的一一块块自自由由存存储储区区中中为为程程序序分分配配一一块块sizeof

106、字字节节大大小小的的内内存存空空间间,该该内内存存空空间间的的首首地地址址被被存存于于指指针针变变量量中。中。1432.Deletev运运算算符符deletedelete用用于于释释放放newnew分分配配的的存存储储空空间间。其其基本的语法形式为:基本的语法形式为:deletedelete指针变量;指针变量; 其中,指针变量保存着其中,指针变量保存着newnew分配的内存的首地址。分配的内存的首地址。144【例【例2.14】操作符】操作符new和和delete的使用。的使用。 /*02_14.cpp*/#includeusingnamespacestd;intmain()int*p;p=ne

107、wint;*p=10;cout*p;deletep;return0;10145【例【例2.15】下面是一个将运算符】下面是一个将运算符new和和delete用用于结构类型的例子。于结构类型的例子。 /*02_15.cpp*/#include#includeusingnamespacestd;structpersoncharname20;intage;intmain()person*p;p=newperson;strcpy(p-name,wangfun);p-age=23;coutnnameendlage;deletep;return0;146虽然虽然new和和delete完成的功能类似于完成的

108、功能类似于malloc()和和free(),但是他们有以下几个优点:但是他们有以下几个优点:(1)new可可以以自自动动计计算算所所要要分分配配内内存存的的类类型型的的大大小小,而而不不必必使使用用sizeof()来来计计算算所所需需要要的的字字节节数数,这这就就减减少少了了发发生生错错误误的的可能性。可能性。(2)new能能够够自自动动返返回回正正确确的的指指针针类类型型,不不必对返回指针进行强制类型转换。必对返回指针进行强制类型转换。(3)可以用)可以用new将分配的对象初始化。将分配的对象初始化。(4)new和和delete都都可可以以被被重重载载,允允许许建建立自定义的内存管理算法立自

109、定义的内存管理算法147下面我们对下面我们对new和和delete的使用再作几点说明:的使用再作几点说明: (1)用用new分分配配的的空空间间,使使用用过过结结束束后后应应该该用用也也只只能能用用delete显显式式地地释释放放,否否则则这这部部分分空空间间将将不不能收回而变成死空间。能收回而变成死空间。(2)使使用用new动动态态分分配配内内存存时时,如如果果没没有有足足够够的的内内存存满满足足分分配配要要求求,new将将返返回回空空指指针针。因因此此通通常常要对内存的动态分配是否成功进行检查要对内存的动态分配是否成功进行检查。 148【例【例2.16】对内存的动态分配是否成功进行检查。】

110、对内存的动态分配是否成功进行检查。 /*02_16.cpp*/#includeusingnamespacestd;intmain()int*p;p=newint;if(!p)cout”allocationfailuren”;return-1;*p=20;cout*p;deletep;return0;若动态分配内存失败,若动态分配内存失败,此程序将在屏幕上显示:此程序将在屏幕上显示:“allocation allocation failure”failure”。 149说明:说明:(1)使使用用new可可以以为为数数组组动动态态分分配配内内存存空空间间,这时需要在类型名后面缀上数组大小。这时需要

111、在类型名后面缀上数组大小。其语法形式为:其语法形式为:指针变量指针变量=new类型名【下标表达式】;类型名【下标表达式】;例如:例如:int*pi=newint10;150(2)释释放放动动态态分分配配的的数数组组存存储储区区时时,可可以以使使用用delete运算符,其语法形式如下:运算符,其语法形式如下:delete指针变量;指针变量;v无无须须指指出出空空间间大大小小,但但老老版版本本的的C要要求求在在delete的的方方括括号号中中标标出出数数字字,以以告告诉诉C+要要释释放多少个元素所占的空间。放多少个元素所占的空间。v例如:例如:deletepi;delete10pi;151(3)n

112、ew可可在在为为简简单单变变量量分分配配内内存存空空间间的的同同时,进行初始化。这时语法形式为时,进行初始化。这时语法形式为:指针变量指针变量=new类型名(初始值列表);类型名(初始值列表);152【例【例2.17】new在为简单变量分配内存空间的同时,在为简单变量分配内存空间的同时,进行初始化。进行初始化。 /*02_17.cpp*/#includeusingnamespacestd;intmain()int*p;p=newint(99);if(!p)coutallocationfailuren;return1;cout*p;deletep;return0;153【例【例2.18】下面是一

113、个数组动态分配内存空间的例】下面是一个数组动态分配内存空间的例子。子。 /*02_18.cpp*/#includeusingnamespacestd;intmain()double*s;s=newdouble10;if(!s)coutallocationfailuren;return-1;for(inti=0;i10;i+)si=100.00+2*i;for(intj=0;j10;j+)coutsj;deletes;return0;1542.7异常处理异常处理 程序中的错误可分为两大类:程序中的错误可分为两大类:v语语法法错错误误:包包括括编编译译错错误误和和链链接接错错误误,这这类类错错误误

114、在在编编译译链链接接时时根根据据出出现现的的错错误误信信息息可以进行纠正。可以进行纠正。v运运行行错错误误:在在编编译译链链接接通通过过后后在在运运行行时时出出现现的的错错误误,通通常常包包括括不不可可预预料料的的逻逻辑辑错错误误和可预料的运行异常。和可预料的运行异常。155v在在运运行行没没有有异异常常处处理理的的程程序序时时,如如果果运运行行情情况况出出项项异异常常,由由于于程程序序本本身身不不能能处处理理,程程序序只只能能终终止止运运行行。如如果果在在程程序序中中设设置置了了异异常常处处理理机机制制,则则在在运运行行情情况况出出项项异异常常时时,由由于于程程序序本本身身已已规规定定了了处

115、处理理的的方方法法,于于是是程序的流程就转到异常处理代码段处理。程序的流程就转到异常处理代码段处理。v因此,因此,异常处理异常处理指的是对运行时出现的差指的是对运行时出现的差错以及其他例外情况的处理。错以及其他例外情况的处理。 1562.7.1异常处理的机制异常处理的机制 vC+语语言言使使用用了了throw和和try-catch语语句句支支持异常处理。持异常处理。vC+语语言言中中异异常常处处理理的的机机制制由由以以下下3步步来来实现。实现。(1)检查异常(使用)检查异常(使用try语句块)语句块)(2)抛出异常(使用)抛出异常(使用throw语句块)语句块)(3)捕捉异常(使用)捕捉异常(

116、使用catch语句块)语句块)其中(其中(1)()(3)两步在上级函数中)两步在上级函数中处理,第(处理,第(2)步在可能出现异常的当前)步在可能出现异常的当前函数中处理。函数中处理。 157vthrow语语句句一一般般是是由由throw运运算算符符和和一一个个数数据据组成的,其形式为:组成的,其形式为:throw表达式;表达式;vtry-catch的结构为:的结构为:try被检查的语句被检查的语句catch(异常信息类型异常信息类型变量名变量名)进行异常处理的语句进行异常处理的语句158说明:说明:(1)try块和块和catch块作为一个整体出现。块作为一个整体出现。(2)一一个个try-c

117、atch结结构构中中只只能能有有一一个个try块块,但但却却可可以以有有多个多个catch块,以便与不同的异常信息匹配。块,以便与不同的异常信息匹配。(3)catch后后面面的的括括号号中中,一一般般只只写写异异常常信信息息的的类类型型名名。但但catch()表示可以捕捉任何类型的异常信息。表示可以捕捉任何类型的异常信息。(4)在在某某些些情情况况下下,在在throw语语句句中中可可以以不不包包括括表表达达式式, 如:如:catch()/其他语句其他语句throw;/将将编编译译捕捕获获的的异异常常信信息息再再次次原原样样抛抛出出,由上一层的由上一层的catch处理器处理处理器处理(5)如如果

118、果throw抛抛出出的的异异常常信信息息找找不不到到与与之之匹匹配配的的catch块块,那那么么系系统统就就会会调调用用一一个个系系统统函函数数terminate,使使程程序序终终止运行。止运行。1592.7.2异常处理的实现异常处理的实现 C+语言中异常处理的完整过程:语言中异常处理的完整过程:v程序顺序执行程序顺序执行try块中的语句。块中的语句。v如如果果在在执执行行try块块内内的的各各条条语语句句中中都都没没有有发发生生异异常常,则则跳跳过过catch块块,转转到到执执行行catch块后面的语句。块后面的语句。v如如果果在在执执行行try块块内内的的某某一一条条语语句句中中发发生生异

119、异常常,则则由由被被调调函函数数的的throw抛抛出出异异常常信信息。息。v由由throw抛抛出出的的异异常常信信息息提提供供给给catch块块,系系统统寻寻找找与与之之匹匹配配的的catch子子句句,进进行行异异常常处处理理后后,程程序序继继续续执执行行catch子子句句后后面面的语句,而跳过的语句,而跳过try中的剩余语句。中的剩余语句。160【例【例2.19】C+异常机制的处理过程示例。异常机制的处理过程示例。 /*02_19.cpp*/#includeusingnamespacestd;intdivide(intx,inty)if(y=0)throwy;/如果分母为零,抛出异常如果分母

120、为零,抛出异常returnx/y;intmain()inta=10,b=5,c=0;try/检查是否出现异常检查是否出现异常couta/b=divide(a,b)endl;coutb/a=divide(b,a)endl;couta/c=divide(a,c)endl;coutc/b=divide(c,b)endl;catch(int)/捕获异常并作出处理,即输出一条提示信息捕获异常并作出处理,即输出一条提示信息coutexceptofdividezeroendl;coutcalculatefinishedendl;/catch块的后续语句块的后续语句return0;161a/b=2b/a=0e

121、xceptofdividezerocalculatefinished1622.8本章小结本章小结 本章主要有以下内容。本章主要有以下内容。1简单的简单的C+程序程序v用用C+语语言言编编写写的的源源程程序序扩扩展展名名为为.cpp,在在程程序序的的开开头头有有文文件件包包含含语语句句#include以以及及使使用用C+标标准准名名字字空空间间的语句的语句usingnamespacestd;。v这这是是因因为为C+语语言言在在iostream中中提提供供的的输输入入/输输出出流流可可以以更更加加方方便便地地完完成成输输入入/输输出。出。v在在C+源源程程序序中中可可以以使使用用/*/或或/两两种

122、种方式进行注释。方式进行注释。1632const修饰符修饰符vconst修饰符有了更灵活的运用,可以更修饰符有了更灵活的运用,可以更安全地定义符号常量;安全地定义符号常量;v比用宏定义更安全;可以和指针结合在一比用宏定义更安全;可以和指针结合在一起使用,定义指向常量的指针、常指针和起使用,定义指向常量的指针、常指针和指向常量的常指针;指向常量的常指针;v可以在定义指针及引用形式参数时,用可以在定义指针及引用形式参数时,用const修饰,保护对应的实际参数变量修饰,保护对应的实际参数变量不被修改。不被修改。 1643C+新增数据类型新增数据类型vC+语语言言新新增增加加了了bool类类型型处处理

123、理逻逻辑辑值值,新新增增加加了了string类类型型(使使用用时时必必须须包包含含std名名字字空空间间中中的的string头头文文件件)更更方方便地操作字符串。便地操作字符串。v枚枚举举类类型型和和联联合合体体类类型型都都可可以以默默认认类类型型名名,都都有有独独特特的的用用法法,而而结结构构体体在在C+语语言言中中允许有数据成员和成员函数。允许有数据成员和成员函数。vC+语语言言还还提提供供了了灵灵活活多多样样的的强强制制类类型型转转换方法。换方法。1654有关函数的区别有关函数的区别v函函数数仍仍然然是是C+语语言言面面向向过过程程的的程程序序设设计计最最基基本本单位,与单位,与C语言相

124、比,有一些新的要求和功能。语言相比,有一些新的要求和功能。v在在C+语语言言中中,函函数数必必须须声声明明原原型型,并并且且明明确确给给出出返返回回值值类类型型;局局部部变变量量的的定定义义更更加加灵灵活活,可可以以随随用用随随定定义义;全全局局变变量量在在C+程程序序中中也也可可以以通通过过域域解解析析符符:使使其其在在同同名名局局部部变变量量的的作作用用域域可见;可见;vC+程序的形式参数可以带有默认参数值;程序的形式参数可以带有默认参数值;vC+语语言言的的内内联联函函数数机机制制提提供供了了一一种种以以空空间间换换时时间的方法;间的方法;vC+语语言言通通过过函函数数重重载载将将一一些

125、些功功能能相相同同或或类类似似而而只只是是形形式式参参数数有有所所区区别别的的一一组组函函数数以以相相同同的的函函数数名名命命名名,调调用用时时根根据据实实际际参参数数与与形形式式参参数数的的匹匹配配情情况况由由系系统统自自行行确确定定调调用用的的是是哪哪一一个个重重载载函函数数,这这种种机机制制减减轻轻了了用用户户的的记记忆忆负负担担,可可以以更加方便地使用某一类功能的函数。更加方便地使用某一类功能的函数。1665引用的概念引用的概念v引引用用是是C+语语言言新新增增加加的的概概念念,是是变变量量的的别别名名,因因此此不不另另外外分分配配内内存存空空间间,使使用用时时与与一一般般的的变变量一

126、样。量一样。v将将引引用用作作为为形形式式参参数数可可以以方方便便直直观观地地改改变变对对应应实实在在参参数数变变量量的的值值,而而且且效效率率更更高高;而而引引用用返返回回值值使使得得函函数数调调用用结结果果可可以以作作为为左左值值,这这也也是是引用的一大特色。引用的一大特色。6动态内存管理动态内存管理vC+语语言言提提供供了了更更加加方方便便的的动动态态内内存存空空间间的的管管理理,用用new和和delete两两个个运运算算符符非非常常方方便便地地申申请请、回收一个或连续若干个连续的动态内存空间。回收一个或连续若干个连续的动态内存空间。vvoid类型的指针在编写通用程序时非常有用。类型的指

127、针在编写通用程序时非常有用。1677异常处理异常处理vC+语语言言提提供供了了处处理理异异常常的的有有效效机机制制,通通过过throw抛抛出出异异常常,通通过过try-catch块块检检测测、捕捕捉捉并并处处理理异异常常,从从一一定定程程度度上上保证了程序的健壮性保证了程序的健壮性 本本章章内内容容是是利利用用C+语语言言进进行行过过程程化化程程序序设设计计的的基基础础,了了解解和和掌掌握握C+语语言言与与C语语言言在在过过程程化化程程序序设设计计方方面面的的区区别别更更有有利利于于用用C+语语言言编编程程,这这些些知知识识也也将将是是接接下下来学习来学习C+面向对象程序设计的基础。面向对象程序设计的基础。168

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

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