21天学通C++(第6版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-06-22 04:38:32

点击下载

作者:[美]JesseLibertySiddharthaRaoBradleyJones著

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

21天学通C++(第6版)

21天学通C++(第6版)试读:

第1章绪论

欢迎使用本书!通过阅读本章,您将迈出成为高级C++程序员的第一步。在本章中,您将学习:

• 为何C++是软件开发的标准

• 开发C++程序的步骤

• 输入、编译和链接第一个C++程序

1.1 C++简史

自第一代电子计算机诞生后,计算机语言经历了翻天覆地的变化。起初,程序员们使用最原始的计算机指令,即机器语言,这些指令是由0和1组成的字符串。很快,人们就发明了汇编语言,将机器指令映射为人们可以阅读和易于处理的助记符,如ADD和MOV。

然而,随着编写的软件应用程序执行的任务日益复杂(如计算弹道),程序员意识到需要一种能够执行相对复杂的数学指令的语言,这些数学指令可转换为众多的汇编代码(机器语言指令)。FORTRAN应运而生,它是编程领域中第一种针对数值和科学计算进行了优化的高级编程语言,支持子程序、函数和循环等。随后出现了更高级的语言,如BASIC和COBOL,它们让程序员能够使用类似于单词或句子的源代码(如Let I=100)进行编程。

C语言对B语言做了革命性改进,而B语言是BCPL(Basic Combined Programming Language)语言的改进版本。虽然发明C语言旨在帮助程序员使用当时新出现的硬件功能,但它得以流行应主要归功于其可移植性和速度。C语言是一种过程化语音,但随着计算机语言进入面向对象时代,Bjarne Stroustrup于1981年发明了C++,它是发展最快、使用最广泛的编程语言之一。除新增了诸如运算符重载和内联函数等功能外,C++还实现了诸如继承(支持多继承)、封装、抽象和多态等面向对象概念。C++还实现并不断改进了模板(泛型类或函数)概念,而诸如Java和C#等较新的语言直到最近才支持这种概念。

在C++之后,Java给编程领域带来了又一次革命。它得以流行的主要原因是Java应用程序可在多种流行的平台中运行;另一个原因是其简单性,它不支持众多让C++功能强大的功能。除不支持指针外,Java还负责为用户管理内存和执行垃圾收集。在Java之后,C#是最先开发的基于框架(微软.NET框架)的语言之一。C#借鉴了Java和C++的设计思想和语法,但在有些方面与这两种语言都不同。.NET框架支持管理版C++(称为托管C++),它向C++程序员提供了.NET框架的优点(如自动管理内存和收集垃圾),且执行速度比其他基于框架的语言(如C#)快。

当前,很多应用程序仍是使用C++编写的,这不仅是因为更新的语言仍不能满足众多应用程序的需求,还因为C++向程序员提供了灵活性和强大功能。C++是一种不断发展的语言,它遵循ANSI标准。

1.1.1 解释器和编译器

解释器翻译并执行程序,它读取程序指令(源代码),并直接将其转换为操作。编译器先将源代码转换为中间格式;这通常被称为编译,它生成目标文件。然后,编译器调用链接器,将目标文件组合成为可执行程序,其中包含可直接在处理器上运行的机器代码。

由于解释器按原样读取代码并即时执行代码,因此程序员使用起来比较方便。当前,大部分解释型程序被称为脚本,解释器被称为脚本引擎。

编译器增加了一个步骤:将人类能够理解的源代码编译成机器能够理解的目标代码。这个步骤看似不太方便,但由于将源代码转换为机器语言这样一个耗时的任务已经在编译阶段完成,因此编译型程序的运行速度非常快。由于转换工作已经完成,因此执行程序时无需做这样的工作。

诸如C++等编译型语言的另一个优点是,可以向没有编译器的用户提供可执行程序。使用解释型语言时,计算机中必须安装了解释器才能运行程序。

有些语言(如Visual Basic 6)将解释器称为运行库;其他语言(如Visual Basic .NET和Java)有另一个组件——虚拟机(Virtual Machine,VM)或运行库。VM也是解释器,但不是源代码解释器——将人类可读的语言转换为依赖于计算机的机器码;而对编译后的独立于计算机的虚拟机语言(中间语言)进行解释和执行。因此,这些语言需要编译器,它负责将程序员编写的源代码进行转换,即将源代码编译成虚拟机或运行库能够解释的内容。

C++通常是一种编译型语言,虽然存在一些C++解释器。和众多其他编译型语言一样,C++以能够生成快速而功能强大的程序著称。程序一词通常有两种含义:一种是指程序员编写的指令(源代码),另一种是指可执行软件。这种区分可能会引起巨大的混乱,因此本书尽可能将源代码和可执行文件区分开来。。

1.1.2 不断变化的需求和平台

当前,程序员们面临的问题与20年前完全不同。在20世纪80年代,人们编写程序是为了管理和处理大量的原始数据。那时,编写代码的人和使用程序的人都是计算机专业人员。现在,越来越多的人开始使用计算机,其中大部分人对计算机和程序的工作原理知之甚少。人们通常只愿意将计算机作为一种工具来解决商务问题,而无心去钻研它。

具有讽刺意味的是,为满足这些新用户易于使用的需求,程序变得越来越复杂。那种需要输入神秘的命令,结果却只看到一大串枯燥的数据的时代已一去不复返。当前的程序大都采用对用户友好的界面,其中包括多个窗口、菜单、对话框以及非常形象的标识,对此我们已经非常熟悉了。

随着万维网的发展,计算机跨入了一个新的市场渗透时代。使用计算机的人比任何时候都多,他们对计算机的期望也非常高。万维网的易用性也提高了人们的期望,他们期望程序能够充分利用万维网提供的信息。

在过去的几年中,应用程序的运行平台已扩展到其他设备,不再限于桌面PC,而被用于手机、个人数字助理(PDA)、平板PC和其他设备。

在本书第一版面世后的几年中,为满足用户的需求,程序员编写的程序变得越来越庞大,越来越复杂。因此,对有助于应对这种复杂性的编程技术的需求显得越来越迫切。

随着编程需求的改变,用于编写程序的语言和技术都得到了发展,以帮助程序员应对这种复杂性。虽然完整的发展历程令人神往,但本书只介绍其中的重要组成部分:从过程化编程到面向对象编程(OOP)的转变。

1.1.3 过程化编程、结构化编程和面向对象编程

直到不久前,计算机程序还被看作是一系列处理数据的过程。过程(函数或方法)是指一组依次执行的指令。数据与过程是分离的,编程技巧是跟踪哪些函数调用了其他函数以及哪些数据被修改了。为避免这种混乱,结构化编程应运而生。

结构化编程的主要思想是分而治之。可将计算机程序看作由一系列任务组成。任何过于复杂、无法简单描述的任务都将分解为一系列较小的子任务,直至每个任务都很小,很容易理解。

例如,计算公司职员的平均工资是一项较复杂的任务。然而,可将其划分成下面几个子任务:

1.确定公司员工数;

2.确定每个员工的工资;

3.计算工资总额;

4.将工资总额除以员工数。

计算工资总额还可分成以下几步:

1.读取每个职员的记录;

2.读取工资额;

3.将工资额添加到工资总额中;

4.读取下一个职员的记录。

读取每个职员的记录又可分为以下几步:

1.打开职员文件;

2.找到正确的记录;

3.读取数据。

结构化编程仍是一种非常成功的、处理复杂问题的方法。然而,到20世纪80年代后期,它的许多不足逐渐暴露出来了。

首先,一种自然而然的愿望是,将数据(如职员记录)及其操作(排序、编辑等)看作一个整体。不幸的是,结构化程序将数据结构与处理它们的函数分开,因此在结构化编程中,没有将数据同处理它的函数关联起来的自然方式。结构化编程通常被称为过程化编程,因为其侧重于过程而不是对象。

其次,程序员们经常发现自己需要重用函数,但处理一种数据类型的函数通常不能用于处理其他类型的函数,这限制了重用函数带来的好处。

1.1.4 面向对象编程(OOP)

面向对象编程旨在满足以上种种需求,提供了一种管理极度复杂性的技术,实现了软件组件的可重用性,并将数据和操纵数据的任务结合起来。

面向对象编程的实质是模拟对象(东西或概念)而不是数据。要模拟的对象可以是屏幕上的小部件,如按钮、列表框,也可以是现实世界中的东西,如客户、自行车、飞机、猫和水。

对象有特征(属性),如快、宽敞、黑色、湿;也有功能,如购买、加速、飞、叫、冒泡。在编程语言中描述这些对象是面向对象编程的工作。

1.1.5 C++和面向对象编程

C++全面支持面向对象编程,它包括以下三个面向对象开发要素:封装、继承和多态。1.封装

工程师需要在正在制造的设备中添加电阻时,通常不会从头开始去制作电阻。他会到电阻库中,检查表示属性的彩色条纹,选择一个满足需求的电阻。对于这位工程师来说,电阻是一个黑盒子——只要电阻满足规格即可,他不必关心电阻的内部结构及其工作原理。

能够成为自包容单元的特性称为封装。利用封装可以实现数据隐藏。数据隐藏是一种非常有价值的特性,用户不必了解或关心对象的内部工作原理就可以使用它。就像使用冰箱时不必关心压缩机的工作原理一样,也可以使用设计优良的对象而不必了解其内部工作部件。内部工作部件的变更不会影响程序的运行,条件是它们满足指定的规格,就像可以更换冰箱中的压缩机一样。

同样,工程师在使用电阻时也不必知道电阻的内部状态。电阻的所有属性都封装在电阻对象中,它们不会通过电路传出。无需了解电阻的工作原理就可以有效地使用它。其内部工作部件隐藏在电阻壳内部。

C++通过创建被称为类的用户定义类型来支持封装。第10章将介绍如何创建类。类一经创建,就是一个完全封装的实体—— 一个完整的单元。类的内部工作原理都可以隐藏。对于定义良好的类,用户只需知道如何使用它即可,而不必知道它是如何工作的。2.继承和重用

Acme汽车公司的工程师们要制造一款新车时,他们有两种选择:从头做起或修改现有车型。也许他们的Star车型已接近完美,但他们想加一个涡轮增压器和一个六速变速装置。总工程师不想从头开始,于是说:“我们另造一款Star车吧,但给它增加上述附加装置,并将新型车叫做Quasar。”Quasar其实是Star车型的一种,只是增加了一些新特征的专用车而已。

C++支持继承。使用继承,可以声明一个新类型作为已有类型的扩展。新子类是从已有类型派生而来的,有时被称为派生类型。例如,如果Quasar由Star派生而来,它将继承Star的所有品质,然后可以增加发动机或对其进行改进。继承及其在C++中的应用在第11章介绍。3.多态

当您踩下油门时,新的Quasar车型可能做出与Star车型不同的反应。Quasar可能喷射燃料并启动涡轮增压器,而Star只是让汽油进入化油器中。但对用户而言,他不必知道这些差别。他只需踩下油门,根据他驾驶的是哪种车,将随之发生正确的响应。

C++支持这种想法,即通过函数多态和类多态,不同的对象将做正确的事情。多态是指同一名称有多种形式,将在第12章讨论。

1.2 C++的发展历程

当面向对象的分析、设计和编程开始兴起时,Bjarne Stroustrup对最流行的商用软件开发语言C语言进行了扩展,使其可提供面向对象编程所需的功能。

尽管C++是C的超集,且任何合法的C程序都是合法的C++程序,但从C跳到C++的意义是非常重大的。由于C程序员都能轻松地进入C++世界,因此,多年来C++从其与C的关系中获益匪浅。然而,想真正获得C++带来的好处,很多程序员发现它们不得不放弃很多已有的观念,并学习一种新的分析和解决编程问题的方法。

1.3 应该先学习C语言吗

既然C++是C的超集,那么学习C++前是否该先学C呢?Stronstrup和大多数C++程序员都认为,不仅没有必要先学C,而且不学可能比学了更好。

C编程基于结构化编程概念,而C++基于对象化编程。如果先学C语言,将不得不忘掉C语言提倡的坏习惯。

本书假定读者没有任何编程经验。不过,如果读者是一个C程序员,本书的前几章在很大程度上是一种复习。从第10章开始将开始介绍真正的面向对象软件开发。

1.4 微软的C++托管扩展

在.NET中,微软公司新增了C++托管扩展(Managed Extension),被称为Managed C++。这种对C++语言的扩展让C++能够使用微软公司的新平台和函数库。更重要的是,Managed C++让C++程序员能够充分利用.NET环境的高级功能。要进行专门针对.NET平台的开发,除了解有关标准C++的知识外,还必须学习有关这些扩展的知识。

1.5 ANSI标准

隶属于美国国家标准化协会的授权标准委员会(Accredited Standards Committee)制定了一个C++国际标准。该C++标准也被称为ISO(国际标准化组织)标准、NCITS(国家信息技术标准化委员会)标准、X3(NCITS的前身)标准和ANSI/ISO标准。由于ANSI标准使用最广,故本书沿用名称ANSI标准。

ANSI标准旨在确保C++是可移植的,例如,确保为微软的编译器编写的符合ANSI标准的代码,用其他厂商的编译器进行编译时不会发生错误。由于本书的代码都符合ANSI标准,因此它们都可在Macintosh、Windows或Alpha计算机上通过编译。

对于大多数C++学习者来说,一般接触不到ANSI标准。最新的C++标准为ISO/IEC 14882-2003,前一版本已稳定使用了很长时间,所有的主要制造商都支持它。我们对本书的所有代码都同C++标准进行了比较,以确保它们符合该标准。

别忘了,并非所有的编译器都全面遵循C++标准。另外,在有些方面,C++标准没有做明确的规定,而是留给编译器厂商去选择,因此读者不能完全信任编译器,指望使用不同品牌的编译器进行编译时,程序的运行方式完全相同。由于C++托管扩展只适用于.NET平台,并非ANSI标准的组成部分,因此本书不介绍这些扩展。

1.6 编程准备

所有语言都要求编写程序前对程序作总体设计,C++对此要求更高。本书讨论的大多数问题和场景都是通用的,不需要太多设计。然而,对于复杂问题,诸如那些专业程序员每天都会遇到的问题,必须进行设计。设计得越细致,在指定时间和预算内,设计出能够解决指定问题的程序的可能性越大。良好的设计常使程序的错误少且易于维护。据估计,软件成本的90%为调试和维护费用。良好的设计能够在很大程度上减少这些费用,对项目的总成本有重要影响。

在准备设计任何程序前,需要问的第一个问题是:要解决什么问题?每个程序都应该有明确的目标,即便是本书中最简单的程序也如此。

非常优秀的程序员要问的第二个问题是:不自己编写软件能完成这些任务吗?重用旧程序、使用纸和笔或者购买现成的软件常常是比编写新程序更好的解决问题的方法。能够提供这种替代办法的程序员永远不愁找不到工作,为今天的问题找到廉价的解决方法总会给以后带来新的机会。

理解了要解决的问题,并确定需要为此编写一个新程序后,便可以开始设计了。彻底搞清问题(分析)并制定解决方案(设计)对编写世界级商业应用程序来说是必不可少的。

1.7 开发环境

本书假设您的编译器有一种可以直接写入到控制台的模式(如MS-DOS命令提示符或外壳窗口),不用考虑诸如Windows和Macintosh这样的图形环境。请查找console或easy window这样的选项或查看编译器文档。

您的编译器可能是集成开发环境(IDE)的一部分,也可能有内置的源代码文本编辑器,或者您可能使用能生成文本文件的商用文本编辑器或字处理器。重要的是,无论在什么环境中编写程序,必须将其保存为简单的纯文本文件,文本中没有嵌入字处理命令。可安全使用的编辑器包括:Windows记事本、DOS Edit命令、Brief、Epsilon、Emacs和Vi。许多商用字处理软件如WordPerfect、Word等也都提供了保存简单文本文件的方法。

使用编辑器创建的文件称为源文件,对于C++,它们的扩展名通常为.cpp、.cp或.c。本书中所有源代码文件的扩展名都是.cpp,但请查看您的编译器,看它需要什么样的扩展名。大多数C++编译器并不在乎源代码文件的扩展名,但如果没有指明,许多编译器默认使用.cpp。然而,需要注意的是,有些编译器将.c文件视为C代码,而将.cpp文件视为C++代码。因此再次提醒您,请查看编译器文档。如果对C++源代码文件统一地使用扩展名.cpp,其他程序员将能够更容易地了解您的程序。该做不该做请使用简单的文本编辑器创建源代不要使用保存特殊格式字符的码或编译器提供的内置编辑器。字处理器。如果使用字处理保存文件时使用扩展名.c、.cp或.cpp,器,必须将文件保存为ASCII文推荐使用扩展名.cpp。本文件。查看文档中有关编译器和链接器的如果编译器将扩展名为.c的文件信息,以确保您知道如何编译和链视为C代码而不是C++代码,则接程序。不要使用这种扩展名。

1.8 创建程序的步骤

创建新程序的第一步是在源文件中编写合适的命令(语句)。尽管源文件中的源代码有点隐晦难懂,任何不懂C++的人都很难理解,但它仍被称为人类可读的格式。源代码文件并不是程序,不能像程序那样执行或运行,但可执行程序文件可以。

1.8.1 用编译器生成对象文件

使用编译器可将源代码文件转换为程序。如何启动编译器以及如何告诉它在何处查找源代码随编译器而异;请查看编译器文档。

源代码编译后,将生成一个目标文件,其扩展名通常为.obj或.o,然而它仍不是可执行程序。要把目标文件转换为可执行程序,必须运行链接器。

1.8.2 用链接器生成可执行文件

C++程序通常是将一个或多个.obj文件与一个或多个库链接而生成的。库是编译器提供的一组可链接文件,也可能是单独购买或是程序员创建并编译而成的。所有C++编译器都有一个包含有用函数和类的库,可以将其包含在程序中。第6章和第10章将详细介绍函数和类。

创建可执行文件的步骤如下:

1.创建扩展名为.cpp的源代码;

2.将源代码文件编译成扩展名为.obj或.o的目标文件;

3.将目标文件与所需的各种库链接起来,生成可执行程序。如果使用IDE进行编程,可能有一个名为“生成”的选项,它将为您完成第2步和第3步,并提供可执行文件。

1.9 程序开发周期

如果每个程序都能在第一次运行时可行,则完整的程序开发周期为:编写程序、编译源代码、链接程序和运行。遗憾的是,几乎所有程序(无论它多简单)都会有一些错误。有些错误导致无法通过编译,另一些导致无法链接,还有一些仅在运行程序时才会表现出来(这些错误通常被称为bug)。

无论发现什么类型的错误,都必须改正它,这涉及编辑源代码、重新编译、重新链接以及重新运行程序。图1.1描述了程序开发周期中的各个步骤。图1.1 开发C++程序的步骤

1.10 HELLO.cpp:第一个C++程序

传统的编程图书都以在屏幕上打印Hello World或其变体开始,本书秉承这个历史悠久的传统。

将程序清单1.11中的源代码原封不动(行号除外)地输入到编辑器中,确定输入无误后保存该文件,然后编译、链接并运行它。如果一切顺利,它将在屏幕上打印Hello World。现在不必过多考虑该程序的工作原理,这里提供它旨在让读者熟悉开发周期。接下来的几章将详细介绍该程序的各个方面。在下面的程序清单中,左边的行号旨在方便书中引用,不应将它们输入到编辑器中。例如,对于清单1.1的第1行,应该输入:程序清单1.1 HELLO.cpp

请务必照原样输入,特别要注意标点符号。第5行中的<<是重定向符,在大多数键盘上可按下Shift键,再按两次逗号键输入。第5行中的std和cout之间是2个冒号(::)。第5行和第6行都以分号(;)结束。

另外,务必正确地使用编译器。大多数编译器都会自动链接,但请查看文档,看是否需要提供特殊的选项或执行命令来进行链接。

如果遇到错误,请仔细检查代码,看它与上面的程序清单有何不同。如果第1行有错,如cannot find file iostream,请查看编译器文档,了解如何设置包含路径或环境变量。

如果出现指出没有main函数原型的错误,请在第3行前加一行:int main( );(这是有些编译器使用的main函数原型)。在这种情况下,必须在本书中每个程序的main函数前添加上述代码行。大多数编译器都无此要求,只有少数编译器要求这样做。如果您的编译器是这样的,完成后的程序应如下:如果不知道特殊字符和关键字的发音,将难以阅读程序。第1行应读做“英镑符号include eye-oh-stream”。第5行应读做“ess-tee-dee-see-out Hello World”。

在Windows系统上,试着运行HELLO.exe(或在您的操作系统中运行相应的可执行文件。例如,在UNIX系统上,应运行HELLO,因为在UNIX中可执行程序没有扩展名)。它将Hello World!直接写到屏幕上。如果情况果真如此,那么祝贺您!您输入、编译并运行了您的第一个C++程序。这好像没什么了不起,但几乎每位专业C++程序员都是从这个简单程序起步的。

使用IDE(如Visual Studio或Borland C++ Builder)的程序员可能发现,运行该程序时,将弹出一个窗口,然后迅速消失,根本没机会看清程序的输出。在这种情况下,请在源代码的return语句前添加下述代码行:

这些代码行导致程序暂停,直到用户输入一个字符(可能还需要按下回车键)。它们让用户有机会看到运行结果。如果对于程序hello.cpp需要这样做,则对于本书中的大部分程序也需要这样做。

使用标准库

如果使用的是非常旧的编译器,上述程序将无法运行—找不到新的ANSI标准库。在这种情况下,请按如下修改该程序:

注意,现在库名以.h结尾,在第5行不再在cout前使用std::。这是ANSI标准之前的老式头文件样式。如果您的编译器采用这种方式,而不是前面的方式,则是过时的。为编译本书的示例,读者应更新编译器或下载带最新C++编译器的免费IDE。

1.11 编译器初步

本书不针对特定的编译器。这意味着本书的程序可以在任何平台(Windows、Mac、UNIX、Linux等)上使用任何遵循ANSI标准的C++编译器进行编译。

当前,大多数程序员在Windows环境下编程,大多数专业程序员使用微软编译器。这里无法介绍每种编译器的编译和链接细节,但将介绍如何使用Visual C++ 6,这种编译器的用法与其他编译器相似。

然而,由于编译器的差异,请务必查看编译器文档。

创建Hello World项目

要创建并测试Hello World程序,请按以下步骤执行:

1.打开编译器;

2.从菜单中选择File/New;

3.选择Win32 Console Application,然后输入项目名,如hello,最后单击OK按钮;

4.从选项菜单中选择An Empty Project,单击Finish按钮;将出现一个对话框,其中包含新项目的信息;

5.单击OK按钮,回到主编辑器窗口;

6.从菜单中选择File/New;

7.选择C++ Source File,并在文本框File Name中输入一个名称,如hello;

8.单击OK按钮,回到主编辑器窗口;

9.输入前面所示的代码;

10.选择菜单Build/Build hello.exe;

11.确保没有编译错误,这种信息出现在编辑器底部附近;

12.按Ctrl+F5或选择菜单Build/Execute hello来运行该程序;

13.按空格键结束程序。

FAQ

我能够运行该程序,但窗口稍瞬即失,无法阅读运行结果。请问哪里出现了问题?

答:查看编译器文档,应该有让程序暂停的方法。对于微软编译器,方法是按Ctrl + F5。

对于其他编译器,可以在返回语句之前(即程序清单1.1的第5行和第6行之间)添加如下代码:

这将导致程序暂停,等待用户输入一个字符。要结束程序,可输入任何字母或数字(如1),然后按回车键(如果必要的话)。

std::cout和std::cin的含义将在第2章和第27章讨论,现在只需将其作为神奇的咒语使用即可。

1.12 编译错误

发生编译错误的原因有很多,通常是由于输入错误或其他不经意的小错误引起的。优秀的编译器不仅能告诉您发生了什么错误,还会准确指出代码中的出错位置。更好一些的编译器甚至能指出修改方法。

可以故意在程序中加入一个错误来验证这一点。如果HELLO.cpp运行正常,请编辑它并把程序清单1.1中第7行的括号去掉,修改后的程序如程序清单1.2所示。程序清单1.2 演示编译错误

重新编译该程序,您将看到类似下面这样的错误消息:

错误消息指出有问题的文件和行号以及是什么问题(尽管有点难懂)。在这里,错误消息指出,找遍整个源代码文件,直到到达末尾也没有找到右大括号。

有时候,错误消息只指出错误的大概位置。如果编译器能够准确地识别每个问题,将能够修复代码。

1.13 总结

阅读本章后,读者应该对C++的发展历程及其用于解决什么问题有深入的认识。读者应该深信,对任何对编程感兴趣的人来说,学习C++都是正确的选择。C++提供了面向对象编程工具及系统级语言性能,这使其成为当今开发语言的最佳选择。

在本章中,您学习了如何输入、编译、链接和运行第一个C++程序,并了解了程序开发周期。您还对什么是面向对象编程有一定的了解。在接下来的章节中,您还将不断学习这些主题。

1.14 问与答

问:文本编辑器和字处理器之间有何区别?

答:文本编辑器生成的文件是纯文本文件,没有字处理器所需的格式化命令或特殊符号。简单文本编辑器不支持自动换行、粗体、斜体等。

问:如果编译器有内置的编辑器,必须使用它吗?

答:几乎所有的编译器都能编译由任何文本编辑器生成的代码。然而,使用内置文本编辑器的好处是,在开发周期的编辑和编译步骤之间可以快速地来回移动。高级编译器包含一个完全集成的开发环境,让程序员能够访问帮助文件、就地编辑和编译代码,同时不必离开开发环境即可解决编译和链接错误。

问:可以忽略编译器发出的警告消息吗?

答:编译器通常会指出错误和警告。如果有错误,程序将不能通过编译。如果只有警告,编译器通常是创建可执行程序。

很多书籍对这个问题都含糊其辞。正确的答案是不能!一开始就应养成将警告消息视为错误的习惯。当您所做的事并非您本意时,C++将通过编译器向您发出警告。请认真对待这些警告并设法消除它们。有些编译器甚至有一个设置选项,将所有警告视为错误,进而禁止生成可执行程序。

问:什么是编译阶段?

答:编译阶段是指运行编译器的阶段,与链接阶段(运行链接器时)和运行阶段(运行程序时)相对。这只是程序员用来表示错误通常出现的三种阶段的简称。

1.15 作业

作业包括测验和练习,前者帮助加深读者对所学知识的理解,后者提供了使用新学知识的机会。请尽量先完成测验和练习题,然后再对照附录D的答案,继续学习下一章前,请务必弄懂这些答案。

1.15.1 测验

1.解释器和编译器有何不同?

2.如何使用编译器编译源代码?

3.链接器的作用是什么?

4.开发周期包括哪些步骤?

1.15.2 练习

1.阅读下面的程序,不运行它的情况下猜测其功能:

2.输入练习1中的程序,然后编译并链接它。它做什么?与您的猜测相符吗?

3.输入并编译下面的程序。发生了什么错误?

4.修复练习3中程序的错误,重新编译、链接并运行它。它做什么?第2章C++程序的组成部分

C++程序由类、函数、变量及其他元素组成。本书的大部分内容对这些组成部分进行深入解释,但为了解程序是如何组合在一起的,必须分析一个完整的工作程序。

在本章中,您将学习:

• C++程序的组成部分

• 各部分如何协同工作

• 函数及其用途2.1 一个简单程序

即使是第1章的简单程序HELLO.cpp也有很多有趣的组成部分。本节将对该程序进行更详细的分析。为方便起见,程序清单2.1重新列出了HELLO.cpp的最初的版本。程序清单2.1 用HELLO.cpp说明C++程序的组成部分输出:分析:

在第1行,文件iostream被包含到当前文件中。下面详细分析第1行:第1个字符是符号#,这是预处理器标记。每次启动编译器时,将首先运行预处理器。预处理器浏览源代码,查找以#开头的行,在编译器运行之前处理这些行。有关预处理器的详细内容请参阅第15章和第29章。

include是一条预处理器指令,指出接下来是一个文件名,请找到该文件,读取它并将其放到这里。文件名两边的尖括号告诉预处理器,在通常的所有位置查找该文件。如果编译器安装正确,尖括号将使预处理器在保存编译器的所有包含文件的目录下查找iostream文件。文件iostream(输入输出流)由cout使用,用来向屏幕输出。第1行的作用就是将iostream.h文件包含到该程序中,就好像是您自己亲自将其输入一样。每次调用编译器时预处理器总是在编译器之前运行。预处理器把任何以#开头的行都翻译成一条特殊命令,为编译器准备好代码文件。并非所有的编译器都支持在#include语句中省略文件扩展名。如果出现错误消息,则可能需要修改编译器的包含搜索路径或在#include语句中加上文件扩展名。

实际程序从函数main( )开始。每个C++程序都有一个main( )函数。函数是执行一项或多项操作的代码块。通常函数是由其他函数调用的,但main( )特殊。程序在开始时会自动调用main( )。

和所有函数一样,main( )函数也必须指出返回值类型。在HELLO.cpp中,main( )的返回值类型为int,这意味着在其运行结束后将向操作系统返回一个整数。在这个程序中,它返回整数0。可向操作系统返回一个指出成功还是失败的值,也可使用故障编码描述失败原因。其他应用程序可根据“退出编码”判断应用程序是否成功执行。有些编译器允许将main( )的返回类型声明为void。这已不再是合法的C++,请不要养成这种坏习惯。让main( )返回int,只需返回0即可,就像上面main( )中最后一行那样。有些操作系统允许用户测试程序的返回值。习惯做法是返回0,表示程序正常结束。

所有函数都以左大括号({)开始,以右大括号(})结束。main()函数的两个大括号分别在第4行和第7行。在两个大括号之间的所有代码均被看作是函数的一部分。

std::cout是该程序的灵魂。对象cout用于将一条消息打印到屏幕上。第10章将简要介绍对象,而cout和cin将在第27章详细介绍。在C++中,这两个对象(cin和cout)分别用来处理输入(如从键盘输入)和输出(如输出到控制台)。

cout是标准库提供的一个对象。库是一组类。标准库遵循ANSI标准的每个C++编译器都提供的一组标准类。

您告诉编译器,您要使用的cout对象位于标准库中,这是使用名称空间说明符std指出的。由于可能有来自多个厂商的同名对象,因此C++将世界划分为名称空间。名称空间是一种分类方法,例如,如果说到cout时,指的是标准名称空间而不是其他名称空间中的cout,可以使用std::cout向编译器指出这一点。接下来的几章将将详细地讨论名称空间。

cout的用法如下:输入cout和输出重定向运算符(<<)。输出重定向运算符后面的所有内容都将被输出到屏幕上。要输出一个字符串,请务必使用双引号(″)将其括起,如程序清单2.1所示。需要注意的是,重定向运算符由两个小于号组成,它们之间没有空格。

文本字符串是一系列可打印的字符。

最后两个字符(\n)告诉cout,在Hello World!之后换行。这个特殊代码将在第18章讨论cout时详细介绍。

main( )函数以右大括号(})结束。2.2 cout简介

在第27章,您将学习如何使用cout将数据打印到屏幕。就现在而言,您可直接使用它,而不必关心其工作原理。要将一个值输出到屏幕,只需写cout,后面跟上插入运算符(<<)。插入运算符(<<)由两个小于号(<)组成,但C++将其作为一个字符看待。

最后在插入运算符后输入要输出的数据。程序清单2.2演示了如何使用cout。准确地按程序清单输入,并将其中的Jesse Liberty改成您的名字。当然,如果您也叫Jesse Liberty,那就不用了。程序清单2.2 使用cout输出:有些编译器存在错误,要求在加法操作数两边加上圆括号,即将第13行改为:分析:

语句#include将iostream文件加入到源代码中。使用cout及其相关函数时必须这样做。

该程序首先以最简单的方式使用cout:打印字符串(一系列字符)。\n是一个特殊的格式符,它告诉cout另起一行。

在第6行中,将3个值传递给了cout:

这些值由插入运算符(<<)分开。第1个值是字符串Here is 5: 。请注意冒号后的空格,它也是字符串的组成部分。接下来,将5传递

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载