《C++语言程序设计基础知识》由会员分享,可在线阅读,更多相关《C++语言程序设计基础知识(10页珍藏版)》请在金锄头文库上搜索。
1、第12章 面向对象程序设计与C+基础程序设计语言是编写程序的工具,程序设计语言的发展反映了程序设计方法的演变过 程。随着计算机技术的日新月异,要求软件具有良好的可重用性和可扩展性,这就导致程序 设计方法从结构化程序设计方式转变到面向对象程序设计方式。C语言能够很好地支持结构 化程序设计,C+不仅兼容C,同时具有面向对象的特征,因此充分支持面向对象程序设计。面向对象程序设计的基本概念面向对象技术变革了软件设计的传统方法。解决结构化程序设计不足的方法就是限制数 据的存取权限,面向对象程序设计把数据和使用此数据的过程封装成一个类(类可看成是一 个基本数据类型)。数据的封装和隐藏一方面使得内部数据不被
2、破坏,另一方面程序具有良 好的可读性和相对独立性。类的继承机制不仅提高了代码的可重用性,降低了软件开发难度 和开发周期,同时程序的修改变得容易,软件结构更加稳定,软件的可维护性大大提高。 面向对象软件系统由类的层次结构组成,类的具体实例叫做对象,对象之间通过彼此的联系,共 同实现程序的功能。如图 12-1 所示。图 12-1 面向对象软件系统面向对象程序设计方法提出一些全新的概念:对象、类、封装、数据隐藏、继承和多态性等。多 态性、数据封装和继承共同构筑了面向对象程序设计的三大机制。属性:颜色、进水量、洗涤指示 操作方法:进水排水洗涤甩干1. 类与对象 面向对象的方法学认为,客观世界由对象组成
3、,对象有 自己独特的特征和行为,两者密不可分。面向对象的软件技术中,类是将不同类型的数据和与这 些数据相关的操作封装在一起的集合体。对象可看成类的具体实例。图12-2描述了洗衣机类。图 12-2 洗衣机类示意图【例 12-1】 在现实世界中,钢笔具有笔帽、笔体、笔 尖、颜色、形状等属性特征,钢笔具有的行为是书写、灌钢笔水。钢笔作为一个整体,具有独特 的属性和行为,它们将被抽象成一个钢笔类。这种自成一体性称为封装性。而你正在使用的钢笔, 可以看成钢笔类中的一个具体实例。我们不必关心钢笔的内部结构及实现细节,仅利用钢笔对外 提供的操作,即外部接口,就可以方便地使用钢笔。【例 12-2】 对于整型类
4、型的数据,可以定义对它的四则运算,这是整型数据具有的行为,四 则运算与整型数据封装成一体,命名为“int类”。字符型运算和逻辑运算不可以访问、修改int 类中的数据,只有int类中定义的四则运算才能对其进行操作。显然,我们也无需知道四则运算 是如何定义的, int 类对外界提供的操作接口是“+”、“”、“*”、“/”,可以直接利用这 些接口实现整数的四则运算,这叫做数据的隐藏性。2. 数据的封装和隐藏 封装强调的是数据和行为的自成一体性,也就是将数据和操作数据的函数代码进行有机的结合, 形成“类”。封装具有如下意义:1)面向对象的程序表现出强烈的可读性和独立性。2)程序不依赖数据结构的改变,具
5、有良好的可维护性。当数据结构改变时,只有类中对数据进 行操作的函数需要修改,程序的其他部分不受影响。3)对数据起到一定的保护作用。只有类中的函数才可以修改类中的私有数据。 隐藏是指类把对数据的操作信息隐藏在内部,只提供对象对外的操作接口,用户只能看见对象封 装接口上的信息,这样可以保护内部数据不被破坏,同时使用者使用起来非常方便,并可以容易 地将其扩展成新的产品。3. 类的继承 类的继承是指新的派生类可以继承原有父类的全部数据和操作的机制,并可以在派生类中添加新 的数据和操作方法。新的派生类又叫子类,原有父类又叫基类或超类。例如,想生产敞篷汽车不 用从草图开始,只需要对原有的产品添加新的敞篷功
6、能,这样就会快速开发出一种新的产品。利 用类的继承特性,可以非常方便地产生一系列具有相似特征的对象。再看一个类继承的例子。在小学,我们学过数的四则运算,到中学会进一步学到对数、指数等运 算,到大学将学到微积分等内容。我们每一次的进步都将继承已学过的知识,在已有的基础上不 断扩充新的知识。4. 消息 对象之间通过消息相互联系,也是通过消息让某一个对象完成一定的功能。例如,给洗衣机对象 发洗涤的操作信号,洗衣机就会执行洗涤的功能。在面向对象的程序设计中,消息名就是在对象中定义的操作(或称方法),给对象发消息,就是 让对象执行某一操作,使对象具有行为的能力。如图 12-3 所示。发消息边长、顶点执行
7、操作.求面禾口求面积求周长求面积求面积在C+中的表示:A求面积(边长,顶点坐标)图 12-3 消息机制5. 多态性 多态性表示同一种东西有多种形态。例如,与对方通信,这个动作将有多种表现形态,如采用写 信的方式、打电话、发电报、发电子邮件等。在面向对象的程序设计中,多态性是指同一个(或相似的)操作作用于不同的对象上可以有不同 的独特行为,比如 add 操作,作用在实数对象上,表现为两个实数相加,作用在虚数对象上, 表现为两个虚数相加。面向对象的C+语言允许程序员给不同的对象发同一消息,软件系统会做出决策,即到底执行什 么动作。在静态(编译或连接)时就可以分辨的,可通过函数重载实现;在运行时才能
8、分辨的, 可通过虚函数实现。利用多态性,用户能够发送一般形式的消息,而将所有的实现细节留给接收消息的对象。这种高 层次的抽象, 使得多态性、数据封装和继承共同构筑了面向对象程序设计的三大机制。面向对象程序设计语言C+简介C 语言是一种受到广泛重视和应用的面向过程编程的语言,它采用结构化程序设计技术,即把复 杂的模块层层分解为一系列简单模块。人们侧重于开发具有特定功能的函数,而有些数据(特别 是全局数据)在函数间可随意传递。结构化程序设计语言无法处理高度复杂的程序,为了弥补结构化 C 语言的不足,支持面向对象 的程序设计的C+语言应运而生。C+语言是一种混合性语言,保留了 C语言的全部内容,同时
9、 扩展了 C 语言所不具有的面向对象编程的机制。C+在技术上与C完全兼容,但它具有与C语言完全不同的思维方式,即支持面向对象的程序设 计思想,强调对数据进行封装、保护等深入的维护,强调软件的可扩展性、可修改性和可维护性。 利用C+语言可以进行结构化编程,更重要的功能是进行面向对象的编程。C+程序结构本小节主要介绍两个程序,一个是面向过程的C+程序,见例12-3; 一个是面向对象的C+程 序,见例12-4。通过这两个实例,读者可以对C+程序结构有个初步认识。【例 12-3】 输入一个整 并打印出 注释行C+ 的 注 释 一种是沿用 采用“/*”和对象 A图 12-4 定义类的对象 A以下程序实现
10、数,求平方根 来。有两种类型: C 语言的方法,“ */ ”括起来进行注释,另一种方法是只能用于C+的单行注释,即从“C+的cin与coutcout、cin是C+语言中增加的用来输出和输入的函数,分别代表输出设备对象和输入设备对象。cout和cin函数的使用方式不随变量的类型变化,这正是面向对象语言所追求的。cout 是代表标准输出的流设备,如显示屏。输出操作必须配合操作符“”,表示把该操作符右边的数据输出到显示屏上。 cin 是代表标准输入的流设备,如输入设备键盘。输入操作必须 配合操作符“”,代表从标准输入设备读取数据到内存。cin 与 cout 定义在输入输出流头文件中。3.关键字con
11、st定义符号常量C+中的符号常量使用关键字const来说明,其一般形式:const 类型说明符 常量名=常量值或 类型说明符 const 常量名=常量值例如:定义一个 buf 的常量。const int buf=512或int const buf=5124. new 和 delete 运算符C+新增new和delete作为动态内存分配和释放的操作符,用来增强C语言中原有的函数malloc和free,提咼了内存管理的灵活性。例如:int *p; 引用作为函数参数C+新增了引用,它使函数调用变得清晰、简单,参数传递效率更高。同时,将引用作为函数参 数给编程带来了很大的灵活性。引用可看成某个目标变量
12、的别名,对引用的操作,实际上就是对目标变量的操作,引用与目标变 量完全对应。一旦用目标变量给引用赋初值,引用就被维系在该目标变量上,即引用不会再与其 他目标变量建立联系。引用不能是空,与此相反,指针变量可以为空。声明并初始化引用的一般格式:数据类型& 引用名=目标变量;其中,“数据类型”是定义目标变量的类型,而“数据类型&”是用来声明引用的。例如:int m;int& kk=m; 函数返回类型是引用当函数返回类型不是引用时,实际上是在内存中开辟临时空间存放函数返回的值,而函数返回类 型是引用时,不需要这样一个中间过程,即不需要产生临时变量以存放返回值,而直接把返回值 传回到主函数中,从而大大提
13、高程序执行的效率,同样也节省了空间。注意 不要返回不在主函数作用域内的变量或对象的引用。【例 12-7】返回引用类型的应用。#include using namespace std;int large;int& max(x,y)large=(xy)x:y;return large; 内联函数为了减少函数调用的开销,C+引入了内联函数。内联函数的功能是强迫C+编译程序直接使用 函数体代码替换调用语句,以提高程序的运行速度。内联函数定义的一般形式:inline 函数类型 函数名(形参表)函数体如果在类的声明中直接给出成员函数的定义,该成员函数默认为内联函数。通常只将规模较小又 使用频繁的函数设计为
14、内联函数。8. 带默认形参值的函数C+允许定义带多个默认形参值的函数。例如,设函数原型声明情况如下:int change(int x=10, int y=20);则函数调用情况如下:change(40); 类的定义 类是由成员组成的,包括一组数据成员和成员函数,其定义的一般形式: class 类名private:私有数据和成员函数public:公有数据和成员函数protected:保护数据和成员函数;类的名称由关键字 class 开始,类的定义体夹在一对花括号中,后面可以跟分号,或一组属于 该类的对象。类内的一组成员变量和成员函数可以有以下三种类型:私有数据类型(private)、保护数据类型
15、 (protected)、公有数据类型(public)。如果用 private 来说明类的数据和成员函数,则意味着它们只能被该类中定义的成员函数和友元 函数访问。通常数据默认为私有类型,私有类型的保留字private可以省略。如果用 protected 来说明类的数据和成员函数,则意味着它们只能被该类中的成员函数、友元函 数、该类的派生类中的成员函数所访问。如果用public来说明类的数据和成员函数,意味着可以在类的外部(不通过类的成员函数,如主 函数)存取数据。类中的公有成员函数提供了该类对外的接口,即通过公有成员函数,才可以访 问类的私有数据。2. 类的成员 类的数据成员不仅包含普通的数据变量,而且还可以包含其他类的对象。类是一种新的数据类型, 而对象可看成是由类定义的变量。类的成员函数对类内的数据成员施加操作,实现类的特定功能。 若成员函数很小,可以在类内定义,反之,一般在类外定义。数据成员通常定义为私有或保护类型,以便隐藏和保护数据。成员函数通常定义为公有类型,目 的是提供对外的接口,以便能够对类访问。为了在类外定义成员函数,必须指出该成员函数是属于哪个类的,C+中引入了一个符号“:”, 称为作用域运算符。在类外