C++程序设计(谭浩强编著)《C++程序设计》第1篇基本知识第1章C++的初步知识第2章数据类型与表达式第2篇面向过程的程序设计第3章程序设计初步第4章函数与预处理第5章数组第6章指针第7章自定义数据类型第3篇基于对象的程序设计第8章类和对象第9章关于类和对象的进一步讨论第10章运算符重载第4篇面向对象的程序设计第11章继承与派生第12章多态性与虚函数第13章输入输出流第14章C++工具第8章类和对象8.1面向对象程序设计方法概述8.2类的声明和对象的定义8.3类的成员函数8.4对象成员的引用8.5类的封装性和信息隐蔽8.6类和对象的简单应用举例《C++程序设计》第8章类和对象8.1面向对象程序设计方法概述8.1.1什么是面向对象的程序设计8.1.2面向对象程序设计的特点8.1.3类和对象的作用8.1.4面向对象的软件开发《C++程序设计》第8章类和对象对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其的操作过程。但是当程序规模较大时,面向过程的设计方法就显得力不从心,而C++中的面向对象的设计方法就是为了解决编写大程序过程中的困难而产生的。《C++程序设计》第8章类和对象8.1.1什么是面向对象的程序设计《C++程序设计》第8章类和对象1.对象(object)客观世界中任何一个事物都可看成一个对象,对象可大可小,它是构成系统的基本单位。任何一个对象都应当具有两个要素:属性(attribute)和行为(behavior),它能根据外界给的信息(消息)进行相应的操作。一个对象往往是由一组属性和一组行为构成的。在一个系统中的多个对象之间是通过发送和接收消息互相联系的。如右图8.1所示。图8.1《C++程序设计》第8章类和对象使用面向对象的程序设计方法设计一个复杂的软件系统时,首先确定该系统是由哪些对象组成,并且设计这些对象。在C++中,每个对象都是由数据和函数(即操作代码)这两部分组成,如右图8.2所示。【例】一个三角形对象,它的3个边长就是它的数据。函数则是用来对数据进行操作的,以实现某些功能,如计算出三角形的面积、输出三角形的边长和面积等。调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为(功能)。图8.2《C++程序设计》第8章类和对象2.封装(encapsulation)与信息隐蔽(imformationhiding)所谓“封装”,就是把一个对象的一部分属性和功能对外界屏蔽起来,这样处理可以大大降低了操作对象的复杂程度。封装包含两方面的含义:①将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立、互不干扰;②将对象中某些部分对外隐蔽,只留下少量接口,以便与外界联系,接收外界的消息。这种做法称为信息隐蔽,有利于数据安全,防止无关的人了解和修改数据。C++的对象中的函数名就是对象的对外接口,外界可以通过函数名来调用这些函数来实现某些行为(功能)。《C++程序设计》第8章类和对象3.抽象(abstraction)抽象的过程是对有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。【例】一个三角形可作为一个对象,10个不同尺寸的三角形是10个对象。如果这10个三角形对象有相同的属性和行为,可以将它们抽象为一种类型,称为三角形类型。在C++中,这种类型就称为“类(class)”。这10个三角形就是属于同一“类”的对象。类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。《C++程序设计》第8章类和对象4.继承与重用如果在软件开发过程中想新建一个“类”B,它与已建立的“类”A内容基本相同,只是增加一些属性和行为,这时只需在类A的基础上增加一些新内容即可。这就是面向对象程序设计中的继承机制,它可以简化程序设计的步骤。【例】“白马”继承了“马”的基本特征,又增加了新的属性(颜色),“马”称为是父类或基类,而“白马”是从“马”派生出来的,称为子类或派生类。由于C++提供了继承机制,可以很方便地利用已有的类建立新类,并可以重用已有类中的一部分甚至大部分,大大节省了编程工作量。这就是常说的“软件重用”的思想(softwarereusability)。《C++程序设计》第8章类和对象5.多态性(polymorphism)如果向几个相似而不完全相同的对象发出同一个消息,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。【例】在Windows环境下,用鼠标双击一个文件对象,如果对象是一个可执行文件,则会执行此程序;如果对象是一个文本文件,则启动文本编辑器并打开该文件。C++中的多态性是指:由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,可增加程序的灵活性。《C++程序设计》第8章类和对象8.1.2面向对象程序设计的特点《C++程序设计》第8章类和对象面向过程程序设计是围绕功能进行的,一个功能用一个函数来实现。所有的数据都是公用的,一个函数可以使用任何一组数据,而一组数据又能被多个函数所使用,如右图8.3所示。图8.31.面向过程程序设计的特点《C++程序设计》第8章类和对象在面向对象程序设计中,每一组数据都有特定的用途,它们是某种操作的对象,即一组操作调用一组数据。程序设计者的任务有两个方面:①设计所需的各种类和对象,即决定把哪些数据和操作封装在一起;②考虑怎样向有关对象发送消息,以完成所需的任务。当各个对象的操作完成后,整体任务也就完成了。显然,对一个规模较大的程序来说,面向对象程序设计方法是十分有效的,它能大大降低程序设计人员的工作难度,减少出错机会。2.面向对象程序设计的特点《C++程序设计》第8章类和对象8.1.3类和对象的作用《C++程序设计》第8章类和对象类是C++中实现面向对象程序设计的基础,也是所有面向对象的语言的共同特征。一个有一定规模的C++程序是由许多类所构成的。基于对象就是基于类。与面向过程的程序不同,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性,就成为面向对象的程序设计。基于对象程序设计所面对的是一个个对象,所有的数据分别属于不同的对象。《C++程序设计》第8章类和对象在面向过程的结构化程序设计中,人们常使用下面的公式来表述程序:程序=算法+数据结构算法和数据结构两者是互相独立、分开设计的,程序的设计是以算法为主体。在面向对象程序设计中是把一个算法和一组数据结构封装在一个对象中,即对象=算法+数据结构因而程序=(对象+对象+对象+…)+消息程序设计的关键是设计好每一个对象并确定向这些对象发出的命令(消息),使各对象完成相应操作。《C++程序设计》第8章类和对象8.1.4面向对象的软件开发《C++程序设计》第8章类和对象①面向对象分析(objectorientedanalysis,OOA)在系统分析阶段,系统分析员要和用户结合在一起,对用户的需求作出精确的分析和明确的描述,从宏观的角度概括出系统应该做什么。面向对象的分析,要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,归纳出有关的对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个类(class)来表示。建立一个能反映真实工作情况的需求模型。面向对象的软件工程包括以下5个部分:《C++程序设计》第8章类和对象②面向对象设计(objectorienteddesign,OOD)根据分析阶段形成的需求模型,对每一部分分别进行具体的设计。首先是进行类的设计,类的设计可能包含多个层次(利用继承与派生);然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。在设计阶段,并不牵涉某一种具体的计算机语言,而是用一种更通用的描述工具(如伪代码或流程图)来描述。③面向对象编程(objectorientedprogramming,OOP)根据面向对象设计的结果,用一种计算机语言把它写成程序,显然应当选用面向对象的计算机语言(例如C++),否则无法实现面向对象设计的要求。《C++程序设计》第8章类和对象④面向对象测试(objectorientedtest,OOT)在写好程序后必须对程序进行严格的测试。测试的目的是发现程序中的错误并改正它。面向对象测试是用面向对象的方法进行测试,以类作为测试的基本单元。⑤面向对象维护(objectorientedsoftmaintenance,OOSM)由于对象的封装性,所以修改一个对象对其他对象影响很小。利用面向对象的方法维护程序,大大提高了软件维护的效率。在设计一个大的软件时,要严格按照面向对象软件工程的5个阶段进行的,这5个阶段的工作不是由一个人从头到尾完成的,而是由不同的人分别完成的。《C++程序设计》第8章类和对象8.2类的声明和对象的定义8.2.1类和对象的关系8.2.2声明类类型8.2.3定义对象的方法8.2.4类和结构体类型的异同《C++程序设计》第8章类和对象8.2.1类和对象的关系《C++程序设计》第8章类和对象每一个实体都是对象,每个对象都属于一个特定的类型。有些对象是具有相同的结构和特性的。在C++中对象的类型称为类(class)。类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例。C++中必须先声明一个类类型,然后用它去定义若干个同类型的对象,对象就是类类型的一个变量。类是抽象的,不占用内存,而对象是具体的,占用存储空间。《C++程序设计》第8章类和对象8.2.2声明类类型《C++程序设计》第8章类和对象C++本身并不提供现成的类的名称、结构和内容。类是用户自己根据需要指定的类型。C++中声明一个类类型和声明一个结构体类型是相似的。【例】声明一个结构体类型:structStudent//声明了一个名为Student的结构体类型{intnum;charname[20];charsex;};Studentstud1,stud2;//定义了两个结构体变量stud1和stud2结构体类型只包括数据,而没有操作。《C++程序设计》第8章类和对象【例】声明一个类类型:classStudent//以class开头{intnum;charname[20];charsex;//以上3行是数据成员voiddisplay()//成员函数{cout″num:″numendl;cout″name:″nameendl;cout″sex:″sexendl;//以上4行是函数中的操作语句}};Studentstud1,stud2;//定义了两个Student类的对象stud1和stud2可以看到,类是对象的类型,它是一种广义的数据类型。类类型中既包含数据,也包含操作数据的函数。《C++程序设计》第8章类和对象在声明一个类类型时,一般是把数据隐蔽起来,而把成员函数作为对外界的接口。【例】修改上面类的声明classStudent//声明类类型{private://声明以下部分为私有的intnum;charname[20];charsex;public://声明以下部分为公用的voiddisplay(){cout″num:″numendl;cout″name:″nameendl;cout″sex:″sexendl;}};Studentstud1,stud2;//定义了两个Student类的对象《C++程序设计》第8章类和对象类声明中的private和public称为成员访问限定符(memberaccessspecifier)。用private声明的成员称为私有成员,它不能被类外访问;用public声明的成员称为公有成员,它能被类外访问。用protected声明的成员称为受保护的成员,它不能被类外访问,但可以被派生类的成员函数访问。说明:①在声明类类型时,private成员和public成员的出现次序任意。②如果在类体中既不写关键字private,