友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第4部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



器和视的特定命令。这时,先在如图1。15所示的对话框中的Editor的 

下拉列表框中选择所指定的编辑器或视,然后,与自定义菜单项或工 

具栏的过程相似,在Category中选择命令分类,然后再选择欲设置快 

捷键的集合,在Enter new shortcut框中按下新的快捷键,再单击左 

上角的Assign按钮,即可将所按的新快捷键与相应的命令相关联,在 

该快捷方式所属的编辑器或视内按下这些快捷键时,相应的命令会被 

调用。  



                            



          图1。 14 在按钮图标上右击鼠标弹出的上下文菜单  


…………………………………………………………Page 34……………………………………………………………

                                              



                     图1。 15 设置新的快捷键  



1。6。3 使用宏  



宏是Microsoft  Developer  Studio的新片本所提供的强大的定制工 

具。与通常概念中的宏不同,在Microsoft Developer Studio 中,宏 

不再是一系列简单命令的记录和回放,而是使用了一种完整的编程语 

言——VBScript,VBScript使用了与Visual  Basic相似的语法。整个 

Microsoft Developer Studio在VBScript 中被看作是一个具有复杂结 

构的分层对象。通过访问调用这些对象的属性和方法,可以在最大程 

度上控制Microsoft Developer Studio的行为。  



简单的宏可以通过录制来生成。下面的过程讲述了录制宏的整个过 

程:  



1。    选择Tools菜单中的Macro命令,直至弹出如图1。16所示的对话 

框。  



                                          



                      图1。16 准备生成宏  



2。   单击Record按钮,然后输入宏的名称。这时,你可以看到多了两 


…………………………………………………………Page 35……………………………………………………………

个工具栏按钮:               。然后,按顺序执行一系列的操作,中间可以 

单击按钮        来暂停录制,以跳过那些不需要录制到宏中的内容。最 

后,单击        停止宏的录制。  



下面是一次宏录制所生成的代码,可以根据VBScript语言的规则修改 

这些代码以适应你的特殊需要,当然,从头手动的键入这些代码也是 

完全可以的,但这往往要比修改通过宏录制的代码的方法来得慢。  



Sub NewMacro2()  



'DESCRIPTION: A description was not provided。  



'Begin Recording  



ActiveWindow。Close dsSaveChangesPrompt  



Documents。Open 〃F:UsersLeibVcProjnliteranlitera。cpp〃; 〃Text〃  



Documents。Open 〃F:UsersLeibVcProjnliteramain。cpp〃; 〃Text〃  



Windows(〃main。cpp〃)。Active = True  



Executemand 〃ConfigurationSelectTool〃  



Executemand 〃ConfigurationSelectTool〃  



Executemand 〃Build〃  



Documents。SaveAll True  



'End Recording  



End Sub  



这里我们将不对上述代码的内容进行讲解和说明,因为就VBScript语 

言而言,其内容就足以写成一本书了,再加上Microsoft   Developer  

Studio本身提供的对象结构及其使用本身就非常的复杂,讨论这些内 

容已超过了我们将要在本书中讲述的范畴。关于VBScript可以参考 

Visual C++联机文档中的节点:  



                                



而关于Microsoft Developer Studio本身的对象结构则可以参考下面 


…………………………………………………………Page 36……………………………………………………………

的联机文档节点:  



                                    



在Developer Studio Environment User's Guild节点的其它子节点 

处还有许多与Microsoft Developer Studio相关的参考资料,这里就 

不再一一尽述,需要时可以从该节点逐级展开至所需内容。  


…………………………………………………………Page 37……………………………………………………………

      第二章 面向对象编程与C++语言  



面向对象的编程是当前程序设计中的热门话题,在这方面已有很多的 

书籍和其它文献可供参考,而且,全面的讲述面向对象的编程技术也 

不是本书的任务,在这里,本章仅仅介绍使用Visual  C++进行面向对 

象编程中所用到的一些关键概念,这些概念是进一步学习Visual  C++ 

所必须的。除了介绍面向对象编程和C++语言的基本概念外,本章还 

介绍了在使用C++的类时所需注意的一些问题。  



另一个需要注意的问题是,尽管本章会介绍面向对象编程和C++语言 

的基本概念,但是,我们仍然假定阅读本书的读者具有C++语言的基 

础知识,至少,需要使用过C++中的类和对象,并且对它们有一定的 

了解。本章也会介绍类和对象的概念以及如何使用它们,但是,假设 

你在阅读这些内容之前,对它们还是一无所知,那么,我们建议你最 

好先看一下一些专门介绍面向对象编程和C++语言的入门知识,本书 

不需要你非常深入的了解这些内容,因为我们假定你懂得C++语言, 

但不假定你精通C++语言,本章正是写给那些虽然能够使用C++语言中 

的类和对象进行编程,但是对一些概念的认识还不够清晰的C++初学 

者。如果你已经对C++语言以及它在Visual    C++中的实现非常之熟 

悉,那么,你也可以暂时跳过本章的内容,继续阅读本书的其它章 

节。  



本章所要讲述的内容包括:  



 l 面向对象的编程的编程技术  



 l 对象及其特点  



 l 使用C++中的类  



 l 从已有的类中派生新的类  



 l 多态及其在C++中的实现  



 l 类模板  



           第一节 面向对象的编程技术  



本节阐述面向对象的程序设计方法中的若干重要概念、方法和思想。 

在刚开始的时候,也许你对这些概念还不大能搞得清楚,但是,随着 

对C++的使用和了解的深入,当你再回过头来仔细推敲这些概念,就 


…………………………………………………………Page 38……………………………………………………………

会发现对它们有了新的认识。  



传统的 “结构化程序设计”方法是由荷兰学者Dijkstra在70年代提出 

的,它把面向机器代码的程序抽象为三种基本程序结构:顺序结构、 

选择结构和重复结构,并提出了一系列的设计原则,如自上而下、逐 

步求精、模板化编程等。根据这些原则,按照程序所需实现的功能, 

自上而下层层展开。上层是定义算法的模块,最下层是实现算法的模 

块。按照这样的规范构成的模块是高度功能性的,有很强的内聚力。 

但各模块的数据处于实现功能的从属地位,因此,各模块与数据间的 

相关性就较差,无论把数据分放在各个模块里还是作为全局量放在总 

控模块中,模块之间都有很大的耦合力。在Windows程序中,多个模 

块是并发执行的,这样,这种耦合力就会极易导致程序系统出现混 

乱。  



而且,在传统的语言中,程序是由传递参数的程序和函数的集合组 

成,每个过程处理它的参数,并可能返回某个值,这种程序是以过程 

为中心的。在传统的面向过程的程序设计中,程序员必须基于过程来 

组织模块,这必然会导致程序的结构与应用领域中结构差异很大。  



现行程序设计方法的另一个大的缺点是围绕着各种软件系统中关键结 

构的作用域与可见性。许多重要的函数或过程的实现主要地取决于关 

键的数据结构。如果一个或多个这样的数据结构了发生了变化,这种 

变化将涉及到许多方面,许多函数和过程必须重写。有时几个关键的 

数据结构发生变化,将导致整个软件系统的结构崩溃。随着软件规模 

和复杂性的增长,这种缺陷日益明显。当程序达到一定规模后,为了 

修改一个小的错误,常可能引出多个大的错误,究其原因,问题就出 

在传统的程序设计方式上。  



而当前的软件应用领域已从传统的科学计算和事务处理扩展到了其它 

的很多方面,如人工智能、计算机辅助设计和辅助制造等,所需处理 

的数据也已从简单的数字和字符串发展为记录在各种介质上并且有多 

种格式的多媒体数据,如数字、正文、图形、声音和影像等。数据量 

和数据类型的空前激增导致了许多程序的规模和复杂性均接近或达到 

了用结构化程序设计方法无法管理的程度。  



为了最大限度的得用已有的资源和减少程序开发的工作量,需要有一 

种比传统的过程式结构化程序设计方法抽象能力更强的新方法,面向 

对象的程序设计方法正是在这种背景下诞生的。  



2。1。1 面向对象的程序设计  


…………………………………………………………Page 39……………………………………………………………

面向对象的程序的最根本的目的就是使程序员更好的理解和管理庞大 

而复杂的程序,它在结构化程序设计的基础上完成进一步的抽象。这 

种在设计方法上更高层次的抽象正是为了适应 目前软件开发的特点。  



最早的 “面向对象”设计语言是Smalltalk语言,该语言是1972年美 

国Xeron公司Palo  Alto研究中心为快速处理各种信息而在Alto个人机 

上研制的软件,1983年正式发行了Smalltalk  2。0版。Smalltalk  80 

被认为是最纯的面向对象的语言,该语言只有一种数据类型—对象。 

Smalltalk未能推广,Alto机上的软件也从未出售过,但它所开创的 

面向对象程序设计方法将结构化程序设计的抽象层次又增高了一层, 

对程序设计方法产生的影响是巨大的。继Smalltalk之后,出现了许 

多的面向对象的程序设计语言,如Eiffel、Clos、C++和Objective…C 

等,其它的非面向对象的程序设计语言,如Pascal、Basic等也引进 

了新的面向对象的机制,产生了新的Object  Pascal、Visual  Basic 

等面向对象的变种。  



使用面向对象的程序设计方法绝非是要摒弃现有的结构化程序设计方 

法,相反,它是在充分吸收结构化程序设计优点的基础上,引进了一 

些新的、强有力的概念,从而开创了程序设计工作的新天地。面向对 

象的程序设计方法把可重复使用性视为软件开发的中心问题,通过装 

配可重用的部件来生产软件,而不是像目前编程所用的那样,通过调 

用函数库中的函数来实现。这里要注意,我们是基于应用程序这一个 

层次来阐述这些问题是,事实上,在对象内部的实现上,我们常常使 

用过程式的结构化程序设计方法,也常常调用C/C++函数库中的很多 

有用的函数,然而从程序的总体结构上说,它是由一系列对象构成 

的,对象之间能够以某种方式进行通信和协作,从而实现程序的具体 

功能。  



面向对象的程序设计中最基本的概念是对象,一般意义上的对象指的 

是一个实体的实例,在这个实体中包括了特定的数据和对这些数据进 

行操作的函数。对于面向对象的程序设计,一个对象具有状态 

(state)、行为(behavior)和标识 (identity)。对象的状态包括它的 

属性和这些属性的当前值。对象的行为包括可以进行的操作以及所伴 

随的状态的变化。对象的标识用来区别于其它的对象。而一个对 

象的行为由它所支持的接口来定义。我们通常不显式的指定对象 

的状态,而被其接口所包含。使用IUnknown::QueryInterface在接口 

之间进行移动的能力定义了对象的标识。  



对象的核心概念就是通常所说的 “封装性”(encapsulation)、 “继 

承性”(inheritance)和 “多态性”(polymorphism),下面我们分别 

阐述其具体含义。  


…………………………………………………………Page 40……………………………………………………………

2。1。2 封装  



按照面向对象编程原定义,所谓的封装性是指隐藏类 (class)为支持 

和实施抽象所作的内部工作的过程。类的接口是公有的,它定义了一 

个类所能完成的功能,而这些接口的实现是私有的或受保护的,它定 

义了类完成这些功能所作的具体操作。对于使用这些类的编程者来 

说,只需要知道类所能完成的功能,而不需要知道这些功能具体是如 

何实现。拿我们所常的手表作为例子,在使用手表时,我们只需要知 

道手表所能完成的功能和如何使用手表来完成这些功能,这些内容相 

当于对象的接口。我们不需要知道在手表的内部,这些功能是如何实 

现的,因此,对于手表来说,无论手表使用的是一般的机械摆,还是 

石英振荡器,只要它们的使用方法是完全一样的,用户就没有必要知 

道这个不同。另一个例子的集成电路芯片,我们只需要知道该芯片的 

每一个引脚的电气参数和功能,而不必知道这些功能在芯片的内部是 

如何实现的,就可以使用该芯片来组装电路。如果仅就封装性而言, 

这里的手表和集成电路芯片就相当于面向对象的编程中的对象。下面 

我们再举一个例子,众所周知,Win32操作平台目前包括Windows   95 

和Windows NT,而事实上,Windows 95和Windows NT使用了完全不同 

的内核,对于很多同样的操作,在Windows 95和Windows NT两个操作 

系统下的实现方式是不同,但两个操作系统都提供了同样的Win32应 

用程序编程接口 (API),这样,我们所编写的应用程序只需要和Win32 

应用程序编程接口打交道,而没有必要知道具体的每一个Win32   API 

函数在操作系统中是如何实现的。换一种说法就是,Windows       95和 

Windows NT封装了Win32 API函数的具体实现。  



一个类在定义数据的同时也定义了对这些数据的操作,这些操作称作 

方法 (method)。按照面向对象的定义,方法就是对对象中的数据的访 

问。在C++中,对对象中的数据的访问是通过公有成员函数来进行 

的,这些公有成员函数可以在对象的外部进行调用,它们提供了对象 

的外部接口。而对于这些接口的内部的实现在对象的外部的不可见 

的,这些实现包括了类内部所使用的数据结构和支持公有方法的实现 

的私有成员函数,通常,这些数据成员和成员函数是私有的,它们只 

能为类中成员函数所访问,而不能从类的外部进行访问。  



访问一个方法的过程称为向这个对象发送一个消息 (message),对象 

的工作是靠消息来激发的,对象之间也是通过消息发生联系的,即请 

求其它对象做什么或响应其它对象的请求是通过发送或接收消息来实 

现的。  



  l 注意:  


…………………………………………………………Page 41……………………………………………………………

  l 这里的所说消息和在Windows编程中所常说的消息是两个不同术 

   语,尽管在某些方面两者的确有很多相象之处。  



封装可避免许多维护性问题。如果一个基本数据类型的结构被修改 

了,例如一个链表修改成了一个数组,除类中的访问该数据的方法的 

代码外,软件系统的其余部分是不受影响的,因为基本数据在外部是 

不可见的,只能通过公有方法的接口与基本数据发生联系,改变一个 

类的实现,丝毫不影响使用这个类的程序员,从而大大的减少了应用 

程序出错的可能性。  



                                          



               图2。1  自然世界中的继承关系  



2。1。3 继承  



类支持层次机制,因此我们可以借用可重用性部件来很容易的从一个 

或多个已有类出发,来生产各种更符合我们要求的新类。假设我们从 

类A出发来派生新的类B,那么我们称类A为类B的基类 (base  class), 

类B为类A的派生类 (derived   class),类B继承了类A中的各种行为和 

状态,并可添加自己的成员变量和成员函数。  



我们先来看一个例子,图2。1给出了自然世界中的生物的一种继承层 

次图,最高层次的生物类代表了层次结构中最一般的概念,较低层次 

的类表示由上一层的类 (即其基类)所派生的特殊的概念。如上面的继 

承关系,动物类从其基类—生物类中继承生物类的所有属性和行为, 

并且定义了动物类所特有的属性和行为,类似的,脊椎动物类从动物 

类那儿继承了所有的属性和行为,并且定义了自身特有的属性和行 


…………………………………………………………Page 42……………………………………………………………

为;……,人类从灵长动物类那儿继承了所有的属性和行为,并且定 

义了人类所特有的属性和行为。  



之所以举上面的例子是为了将程序空间和现实生活空间来进行对比, 

结果说明一点,类的继承使得我们可以以一种自然的方式来模拟生活 

空间中的对象的层次结构,也就是说,我们可以以一种符合正常思维 

逻辑的自然的方式来思考和组织应用程序的结构,然后,可以将这个 

结构几乎不作修改或者只需作少量的修改地用面向对象的编程来表 

达,从而大大的缩短了软件系统的开发周期。  



下面我们举一个现实编程中的例子,考虑MFC                (Microsoft  

Foundation  Class  Library,Microsoft基础类库)中的CEdit类,它 

封装了Windows中的编辑框控件,图2。2显示了CEdit类的继承结构。  



                               



              图2。2 类CEdit在MFC中的继承层次  



在图2。2中,类CObject是所有的MFC类的根(根是一个术语,它指在继 

承层次中处于最顶层的类,根是所有继承层次中的类的最终基类), 

在类CObject中提供了功能有:串行化支持、运行库信息、对象诊断 

输出以及与集合类的兼容等。类CCmdTarget从类CObject直接派生, 

它是Microsoft基础类库的消息映射结构的基类,消息映射将命令和 

消息传递给所编写的处理成员函数,这里,命令指来自菜单项、命令 

按钮和加速键的消息。类CWnd提供了MFC中所有窗口类的基本功能 

性,它封装了Windows中的窗口句柄hWnd。类CEdit从CWnd直接派生, 

它提供了对Windows编辑控件的特定支持。  



我们看到,类CEdit本身仅提供了特定于编辑控件的38个成员函数, 

但是,你可以通过类CEdit进行调用的成员函数却多达300多个,事实 

上,这些成员函数中的绝大部分由其基类所提供,其中CWnd就为 

CEdit提供了多达304个成员函数,由于CEdit类继承了其基类的数据 

和方法,因此,可以通过CEdit类调用CWnd类中提供的方法来实现对 

标准Windows窗口的操作。  



继承机制所带来的最大优势在于使软件系统非常的易于扩充,程序员 


…………………………………………………………Page 43……………………………………………………………

不仅可以直接的使用各种已有的类,还可以从这些类方便的派生出新 

的类,新的类继承了基类所包括的所有接口和功能,因此只需要定义 

和实现与基类所提供的功能中不同的那一部分,这大大的降低了软件 

开发的复杂性和费用,因此面向对象的编程方式非常之适合于进行大 

型软件系统的开发。  



降低软件开发的复杂性的意义不仅在于它可以有效的降低软件开发的 

费用,而且还使得在软件系统中出错的可能性大为减少。由于类有着 

清晰的继承层次,因此,我们可以很快的定义出错的代码所处的位 

置,因此能够很快的修正程序中出现的问题。  



继承机制还使得我们可以将与现实生活空间相一致的思维方式应用于 

程序空间,即我们可以在程序设计时使用直观的思维方式设计程序中 

所使用的对象的层次结构,然后,直接将此结构映射到面向对象的程 

序空间,而不需要做任何修改或仅需要作少量修改就可以使用面向对 

象的程序设计方
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!