您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > 第9章 面向对象设计思想和类
第9章面向对象设计思想和类人类利用计算机的目的是为了解决实际生活中的问题。计算机和世界的沟通是通过设计的程序来实现的。怎样用计算机语言来描述世界是首先要解决的问题。程序设计思想就是用计算机程序语言来描述世界的。类是面向对象编程的核心,它可以实现对数据的封装、安全控制以及代码的重用。通过类的机制可以深入描述抽象的问题,使开发者不断地提高对问题的认识,以获得更好的解决方案。通过本章的学习,读者能够认识面向对象程序设计思想,掌握类的使用方法,能够编写类来解决实际问题。9.1程序设计思想从1946年计算机出现以后,计算机技术的发展已经是日新月异了,程序设计的方法也经历了不断地发展。最先出现的是结构化程序设计思想,之后又产生了一种具有哲学思想的设计思想,这就是面向对象程序思想(ObjectOrientedProgramming,简称OOP)。面向对象程序设计思想是对结构化程序设计思想的继承和发展,它吸取了结构化程序设计思想的优点,同时又考虑到现实世界与计算机设计的关系。9.1.1结构化程序设计思想结构化程序设计的基本思想是:采用自顶向下、逐步求精的设计方法和单入口单出口的控制结构。通过这样的方法,一个复杂的问题可以被划分为多个简单问题的组合。首先将问题细化为若干模块组成的层次结构,然后把每一个模块的功能进一步地细化,分解成一个个更小的子模块,直到分解为一个个程序的语句为止。9.1.2面向对象程序设计思想面向对象设计的基本思想是:首先将数据和对数据的操作方法集中存放在一个整体中,形成一个相互依存不可分割的整体,这个整体即为对象通过相同类型的对象抽象出其共性而形成类;然后,类再通过外部接口与外界发生联系,对象与对象之间用消息进行通信。面向对象设计思想可以使程序模块间的关系变得简单,因为只有外部接口进行联系;且程序模块的相对独立性高,数据的安全也得到很好的保护。面向对象更引入了继承、多态等高级特性,使软件的可重用性、软件的可维护性都得到了更大的提高。9.2类在面向过程的设计方法中,程序的基本单位是函数;在面向对象设计方法中,程序的基本单位是类。类是C++封装的基本单位,它把数据和函数封装在一起。9.2.1类的定义和组成在面向过程的程序设计方法中,数据和函数是分开的。例如,在C语言中,数据是单独定义的常量或者变量,函数则是操作这些数据的手段。类则把数据和函数集中在了一起。1.类的定义和基本结构2.数据成员类数据成员的声明方式和普通变量声明类似。3.成员函数类中只有数据是不行的,还需要有操作这些数据的手段。9.2.2类成员的访问控制对类成员访问权限的控制,是通过成员的访问控制属性来实现的。类的访问控制属性有以下3种。公有类型(public):公有类型成员用关键字public来声明。公有类型的成员可以被类内部成员访问,也可以被类外部成员访问。对于外部成员来说,想访问类的成员必须通过类的public成员来访问。公有类型成员是访问外部类的惟一接口。私有类型(private):私有类型成员用关键字private来声明。私有类型的成员只允许本类内部的成员函数来访问,类的任何外部访问都是被拒绝的。这就对类中的私有成员进行了有效的隐藏和保护。保护类型(protected):保护类型成员用关键字protected来声明。保护类型和私有类型的性质类似,主要差别在于类继承过程中对新类的影响不同。这在后续章节将介绍。9.2.3类实例和类成员访问类是对事物抽象的描述,它描述了一类事物的共同属性和行为。当把抽象的描述变成一个具体的事物时,就称为类的一个实例(Instance)或者对象(Object)。例如,上面描述手机的类,它可以描述所有种类的手机,如MotorolaA1200是一个具体的手机实体,它就是手机类的一个具体实例。定义了一个类之后,可以定义多个实例。类的定义就像是一个产品的模具,通过这个模具可以生产出多个产品,这些产品就是实例。在前面介绍的一些基本数据类型或者自定义数据类型,其实都是对一种数据类型的抽象描述。当声明一个变量时,就产生了其数据类型的一个实例。类也是一种自定义的数据类型,所以类的实例也就是该类的一个变量。声明一个实例和声明一般变量的方式相同,其格式如下。类名实例名1,实例名2,……9.2.4类的作用域和对象的生存周期一般来讲,类的作用域作用于特定的成员名。但是,如果类的成员函数内部出现与类成员相同的标识符的情况,那么类中这个相同的标识符对这个成员函数的作用域不起作用。例如,对于类CmobilePhone,如果成员函数SetPhoneName中出现了与数据成员m_strPhoneType相同名字的变量,则此时m_strPhoneTyped类作用域对此函数不起作用。9.2.5this指针在前面讲解类的作用域时讲到,如果成员函数内部声明了一个局部变量m_strPhoneType,而此局部变量和类的数据成员CMobilePhone::m_strPhoneType有相同名字的时候(或者成员函数参数表中出现了与类中数据成员相同名字的时候),类的数据成员在成员函数中是不可见的。可是如果此时必须访问CMobilePhone::m_strPhoneType这个数据成员时,该如何操作呢?这就可以利用类中的this指针。this指针是隐含在类的每一个成员函数中的特殊指针,用于指向正在被成员函数操作的对象。9.2.6静态成员类是一种类型而非真实的数据对象。当需要让类的所有实例共享数据时,就需要用到静态成员。类的静态数据成员和静态成员函数统称为类的静态成员。C++就是通过静态成员来实现类的属性和行为的。1.静态数据成员2.静态成员函数9.2.7常成员利用const可以修饰类的成员。当用其修饰数据成员时,该数据成员为常数据成员。当修饰类的函数时,该数据为常成员函数。1.常数据成员和一般的数据类型类似,类的数据成员可以是常量或者常引用。声明常数据成员通过const关键字来完成。声明格式与一般常数据类型类似,其格式如下。const数据类型常数据成员名;2.常成员函数用const关键字定义的函数为常成员函数,其定义格式如下。数据类型函数名(参数表)const;9.3构造函数和析构函数C++中,类的构造函数和析构函数是两种特殊的函数,属于类的基本机制。构造函数负责创建类对象,初始化类成员;而析构函数负责撤销和清理类实例。9.3.1构造函数类是一种复杂的数据类型。通过一个类来声明实例,是一个从一般到特殊的过程。对于不同的实例之间,区别主要有两方面:一是它们的实例名不同;二是数据成员的值不同。在声明一个实例的时候,需要对其数据成员进行赋值,这个过程称为实例(对象)的初始化。实例初始化的工作是由构造函数来完成的。1.构造函数的基本概念2.构造函数的基本使用3.带参数的构造函数9.3.2拷贝构造函数在普通变量的赋值中,可以利用另一个同类型的变量进行赋值。实例的初始化也可以通过其他实例进行初始化,即用一个实例去构造另一个实例。在构造的时候,将已存在的实例中的数据成员值传递给新的实例,将其初始化为与已存在的实例具有相同数据的实例。用一个实例构造另一个实例的方法有两种。一种是先建立实例,然后将已存在的实例值一一赋给新实例,但是这样做非常烦琐;另一种就是利用类的拷贝构造函数实现。类的拷贝构造函数是一种特殊的构造函数,具有一般的构造函数的所有特性。它的作用是将一个已经存在的实例去初始化另一个新的同类实例。拷贝构造函数的原型如下。类名(类名&实例名)拷贝构造函数的实现可以在类外实现,也可以是内联函数。9.3.3默认拷贝构造函数在类定义中,如果开发者未定义拷贝构造函数,则C++会自动提供一个默认的拷贝构造函数。这和构造函数类似。默认的拷贝构造函数的作用是拷贝实例中的每一个非静态数据成员给新的同类实例。如果系统调用了默认的拷贝构造函数,其会将实例中所有的非静态数据成员一一赋给新的实例,这样就完成了实例的拷贝。9.3.4浅拷贝和深拷贝既然系统已经提供了默认拷贝构造函数,为什么还需要自己定义拷贝构造函数呢?主要有以下两个原因。默认的拷贝构造函数无法满足开发者对实例复制细节控制的要求。默认的拷贝构造函数无法对实例的资源进行拷贝(如动态内存等)。9.3.5析构函数对于任何事物都有消亡的过程,对象在完成使命后就会消亡。在对象消亡时,需要对对象之前所分配的资源作必要的清理。例如在实例中,打开了文件或者分配了资源,这些都需要归还给系统。这个过程在C++中称为析构,C++利用析构函数来完成对象消亡时的清理工作。9.4类的组合类是对一类事物的抽象描述,其本身就是一个整体。许多复杂的事物都是由很小的事物组成的。如果用一个类来描述复杂的事物,类将变得非常庞大且实现起来也很困难。在面向对象程序设计中,可以将复杂的对象进行分解、抽象,把复杂的对象分解为几个较为简单的对象,然后通过这些对象的组合形成一个完整的整体。9.4.1类的组合的概念类的组合是描述一个类内嵌其他类的对象作为成员的情况,它们之间是一种包含与被包含的关系。类的组合也称为类的聚合,经过组合的类成为组合类,如将一个类来描述一种手机。首先将其分为软件部分和硬件部分,硬件部分又分为核心处理器模块、输入输出模块、通信模块等;软件部分可分为操作系统和应用软件部分,这些模块还可以进一步进行分解。如果把分解后模块的描述都定义为类,则这种手机就是各种类的组合。9.4.2组合类的构造函数和析构函数在组合类生成对象时,会涉及到类与嵌套类的构造函数和析构函数的问题。在组合类实例化时,组合类会先调用嵌套类的构造函数,然后再调用组合类的构造函数;在组合类进行析构时,则调用顺序相反,会先调用组合类的析构函数,再调用嵌套类的析构函数。9.4.3组合类的初始化组合类在创建对象时,既要对本类的基本数据成员进行初始化,又要对内嵌对象成员进行初始化。类的初始化是通过构造函数进行的。组合类的初始化一般格式如下。类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表),...{类的初始化}9.5友元函数和友元类友元是类之间或者类与函数之间共享数据的一种方式。通过它可以让类外的一些成员访问到类的私有数据成员。在一些情况下,通过友元可以提高程序的效率。9.5.1友元的需求性和定义在一些情况下,一个类中定义的成员函数也适用于其他类,像这样的成员函数在普通的函数中会被定义成函数模板。在函数模板中,也可以对类进行操作。函数的通用类型参数不仅可以代表基本的数据类型,也可以代表类。9.5.2友元函数友元函数是在类声明中由关键字friend修饰的、非本类的成员函数,即友元函数可以是一个普通的函数,也可以是其他类的成员函数,但不是本类的成员函数。友元函数可以通过对象名访问类的私有成员和保护成员。说明一个友元函数的一般格式如下。friend返回值类型函数名(参数);9.5.3友元类类也可以声明为另一个类的友元,这样的类叫做友元类。若类A为类B的友元类,则类A中的所有成员函数都是类B的友元函数,类A中的所有成员函数都可以访问类B的私有成员和保护成员。声明友元类的一般格式如下。classB{……friendclassA;//说明A为B的友元类……};9.6本章实例【实例】定义学生类,实现员工信息的存储和输出。要求从键盘输入3个员工的信息,并输出。分析:本例要求利用类来定义学生信息,前面已经讲过利用结构体来实现类似的功能。与结构体相比,用类来实现此功能的最大优点在于可以使学生的信息进行隐藏,即把学生信息封装到一个类中,通过公开的成员函数接口来操作数据。9.7小结本章主要讲述了面向对象设计思想、类以及类的组合问题。类是面向对象程序设计的基础和核心,是本章的重点内容。类是C++封装的基本单位,它把数据和函数封装在一起。面向对象程序设计方法的基本特点是抽象、封装、继承和多态。类可以包括数据成员和函数成员。类的成员有公有、私有和保护三个部分,在不同部分内的成员具有不同的访问规则。公有部分的成员可以被使用类实例的程序直接访问。而友元使得能够为类开发更灵活的接口,类可以将其他函数或其他类作为友元。虽然友元的应用破坏了数据
本文标题:第9章 面向对象设计思想和类
链接地址:https://www.777doc.com/doc-4026976 .html