C++入门经典(第6版)

978-7-115-44215-4
作者: 【美】Rogers Cadenhead(罗格斯 卡登海德) Jesse Liberty(杰西 立波提)
译者: 周进裴强
编辑: 傅道坤
分类: C++

图书目录:

详情

本书通过大量短小精悍的程序详细阐述了基本的C++编程概念,包括C++程序的组成部分、变量、常量、表达式、语句、运算符、函数、循环、数组、指针、引用、函数和运算符重载、继承、C++14新增功能、面向对象分析和设计、模板、错误和异常处理等主题。 本书是针对C++初学者编写的,不要求读者有C语言方面的背景知识,既可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。

图书摘要

版权信息

书名:C++入门经典(第6版)

ISBN:978-7-115-44215-4

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

• 著     [美] Rogers Cadenhead Jesse Liberty

  译    周 进  裴 强

  责任编辑 傅道坤

• 人民邮电出版社出版发行  北京市丰台区成寿寺路11号

  邮编 100164  电子邮件 315@ptpress.com.cn

  网址 http://www.ptpress.com.cn

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315

Rogers Cadenhead and Jesse Liberty: Sams Teach Yourself C++ in 24 Hours(6th Edition)

ISBN: 0672337460

Copyright © 2016 by Pearson Education, Inc.

Authorized translation from the English languages edition published by Pearson Education, Inc.

All rights reserved.

本书中文简体字版由美国Pearson 公司授权人民邮电出版社出版。未经出版者书面许可,对本书任何 部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


本书通过大量短小精悍的程序详细阐述了基本的C++编程概念,包括C++程序的组成部分、变量、常量、表达式、语句、运算符、函数、循环、数组、指针、引用、函数和运算符重载、继承、C++14新增功能、面向对象分析和设计、模板、错误和异常处理等主题。每章都提供了示例程序清单,并辅以示例输出和代码分析,以阐述该章介绍的主题。为加深读者对所学内容的理解,每章末尾都提供了常见问题及其答案以及练习和测验。

本书是针对C++初学者编写的,不要求读者有C语言方面的背景知识。本书既可作为高等院校教授C++课程的教材,也可供初学者自学C++时使用。


Rogers Cadenhead是一位作者、计算机程序员和Web开发人员,编著过25本与互联网相关的图书,包括Sams Teach Yourself Java in 21 Days和Absolute Beginner’s Guide to Minecraft Mods Programming。他运营的Drudge Retort等网站每年的访问量超过2200万人次。本书的官方站点为http://cplusplus.cadenhead.org

Jesse Liberty编写了大量有关软件开发的图书,包括C++和.NET方面的畅销书。他是Liberty Associates公司(http://www.libertyassociates.com)的总裁,负责编程、咨询和培训工作。


祝贺您!当您阅读到这里时,离学习最重要的编程语言之一—— C++又近了20秒。

如果您再花23小时59分40秒,就将掌握C++编程语言的基本知识。只需24个课程(每个课程不超过1小时),就将学会重要的C++功能,如管理I/O、创建循环和数组、使用模板进行面向对象编程以及创建C++程序。

我们将这些主题组织成了结构完美、易于理解的课程。在每章中,都将通过项目、输出和代码分析,演示相关的主题。另外,还清楚地标出了语法示例,以方便参考。

每章末尾还列出了常见问题及其答案,帮助您更深入地掌握学到的知识。

通过阅读本书来学习C++时,读者不需要有任何编程经验。本书从基本知识开始,既介绍C++语言,又讨论使用C++进行编程涉及的概念。无论读者是刚开始学习编程还是已经有一些编程经验,本书都将让您能够快速而轻松地学习C++语言。

不需要先学C语言。Bjarne Stroustrup创立的C++语言是C语言的继任者,功能更强大,用途更广泛。先学C语言会让您养成一些编程习惯,在您使用C++编程时,这些习惯容易导致错误。本书不要求读者熟悉C语言。

您可学习众多其他的语言,但C++语言最值得学习,因为它经受了时间的考验,当前仍是一种深受欢迎的编程语言。

虽然面世于1979年,但鉴于C++语言的强大功能和灵活性,当前仍被用于开发专业软件。另外,最新版本C++14让这种语言更有用。

诸如Java等其他语言的灵感来自C++语言,学习C++语言也将让您对这些语言有深入认识。掌握C++语言后,便可将这些技能用于当今的任何平台,包括台式机、Linux服务器、移动设备、视频游戏控制台和大型机。

[1]  本书由周进、裴强两位老师共同翻译,其中周进老师负责前12章、附录的翻译工作以及全书的统稿工作,裴强老师负责后12章的翻译工作。在此向两位老师表示感谢!



本章介绍如下内容:

1979年,美国贝尔实验室的一位丹麦计算机科学家开始着手改进C编程语言。Bjarne Stroustrop在其个人网站上解释说,他希望有一种可以高效而优雅地编写程序的语言。

这也是很多人的愿望。

Stroustrop将其作品取名为C++,几十年来,它一直占据着世界顶级编程语言的宝座。多年来,很多编程语言如流星般闪过,但对台式机、服务器、手机等嵌入式设备以及众多其他计算环境的软件开发而言,C++始终是不错的选择。

C++是一种可移植的语言,适用于Microsoft Windows、Apple Mac OS、Linux和UNIX 系统。要学习这种语言,最佳的方式是编写程序,而不考虑运行程序的操作系统。

本书从实用的角度介绍C++,没有对使用的操作系统做任何假设。之所以能够做到这一点,是因为本书介绍的是标准C++(也被称为ANSI/ISO C++),这是国际上达成一致的版本,可移植到任何平台和开发环境。

本书的所有代码都是标准ANSI/ISO C++,可在任何遵循最新C++标准的开发环境中运行。

另外,本书也介绍了最新版(C++14)的新功能。该版本是2014年发布的,因此其名称中包含14;流行的C++开发环境都支持这个最新版本。

C++程序是使用一组协同工作的工具开发的,这些工具称为编译器和链接器。

编译器将C++转换成能够运行的形式,它将程序从适合人类阅读的形式(源代码)转换为机器能够运行的形式(机器代码)。编辑器生成目标文件,链接器则根据目标文件生成可执行文件。

有多种C++编程环境深受欢迎,您以前可能使用过或知道如何获取这些编程环境,这包括GCC(GNU编译器)、Microsoft Visual Studio、NetBeans和Embarcadero C++。

只要在计算机上安装了最新的C++编译器并知道其基本用法,您就能毫无困难地完成本书的编程项目。

如果您没有C++编译器,不知道如何使用编译器或不知道如何寻找编译器,也不用担心,附录D介绍了如何下载并安装GCC——一款卓越的免费编译器。如果您还没有安装C++编译器,现在就请按该附录说的做。

Microsoft Visual Studio也支持C++编程,您可从网站www.visualstudio.com下载其免费版Visual Studio Community。为方便使用Visual Studio学习C++的读者,本书提供了一些相关的指南。

创建您的第一个C++程序之前,有必要了解整个创建过程。

C++程序一开始为源代码,即在Windows“写字板”、Gedit、Emacs或Vi等编辑器中输入的文本。虽然Microsoft Word和其他字处理器能够将文件存储为纯文本,但编程时应使用更简单的编辑器,因为您不需要字处理器的任何格式和显示功能。源代码由没有特殊格式的纯文本组成。


注意:NotePad++是一款免费的Windows文本编辑器,提供了卓越的C++编程支持。拥有一定的程序创建经验后,您将喜欢它提供的一些功能,如代码高亮显示,即以不同的颜色显示不同的语言元素。这个文本编辑器可从https://notepad-plus-plus.org下载。

对于您创建的C++源代码文件,可使用扩展名.cpp、.cxx、.cp或.c。在本书中,所有源代码文件都使用扩展名.cpp,这是C++程序员最常见的做法,也是有些编译器的默认做法。大多数C++都不关心源代码文件的扩展名,但使用.cpp有助于您识别源代码文件。

源代码是供人类阅读的C++程序,必须经过编译和链接才能运行。

编译源代码时,将生成一个目标文件,链接器将把它转换为可执行的程序。

创建C++程序时,将链接一个或多个目标文件以及一个或多个库。库是一系列可链接的文件,提供了有用的函数和类,可供您在程序中使用。函数是一个执行任务的代码块,如将两个数相乘或显示文本。类定义了一种新数据类型和相关的函数。

创建C++程序的步骤如下。

(1)使用文本编辑器创建源代码。

(2)使用编译器将源代码转换为目标文件。

(3)使用链接器链接目标文件和必要的库,生成可执行的程序。

(4)输入可执行文件的名称以运行它。

GCC编译器将编译和链接合而为一。

介绍完程序的创建过程后,该创建您的第一个程序并尝试使用编译器了。

运行您用于创建程序的文本编辑器并新建一个文件。您将创建的第一个程序会在屏幕上显示文本。

在编辑器中输入程序清单1.1所示的文本,但不要包含左边的行号和它后面的冒号。这些行号旨在方便引用代码。

输入时,务必正确地输入标点,如第5行的字符::和<<。

输入完毕后,将文件保存为Motto.cpp。

程序清单1.1 Motto.cpp的完整代码

1: #include <iostream>
2:
3: int main()
4: {
5:     std::cout << "Solidum petit in profundis!\n";
6:     return 0;
7: }

这里的目标是熟悉创建C++程序的步骤。如果您不知道每行代码的功能,也不用担心,第2章将介绍这些代码。

保存文件后,需要进行编译和链接。如果您使用的是GCC,可使用如下命令完成这两项任务:

g++ Motto.cpp -o Motto.exe

这个命令让编译器G++编译文件Motto.cpp,并将其链接为可执行文件Motto.exe。如果编辑成功,将不会显示任何消息。该编辑器仅在有问题时出声:显示一条错误消息以及错误出现在哪行。

如果发生编译器错误,请逐行检查程序,确保没有遗漏任何标点,尤其是第5行和第6行末尾的分号。

解决潜在的问题后,尝试再次编译。如果仍有问题且找不出原因,可从本书配套网站(http://cplusplus.cadenhead.org)下载该程序。

成功编译程序后,就可在计算机上运行Motto.exe,方法与运行其他程序一样:将其名称Motto.exe作为命令输入,再按回车键。

程序Motto的输出如下:

Solidum petit in profundis!

这是奥尔胡斯大学(Aarhus University)的校训。该大学位于丹麦的奥尔胡斯市,是一座公立大学,在校学生3.8万人,在丹麦排名第二。该校训是Seek a firm footing in the depths的拉丁版。

奥尔胡斯大学的校友包括丹麦女王玛格丽特二世、诺贝尔化学奖得主Jens Christian Skou、丹麦王子Fredrik,还有一个名为Bjarne Stroustrop的家伙。

祝贺您现在可将自己称为C++程序员了,但如果您到此止步不前,那么没有人会认为您是那种值得炫耀的C++程序员。

30多年来,C++一直是流行的软件开发语言。它有其独特之处,但熟悉程序的结构后,将很容易创建复杂的程序。

在接下来的几章中,您将学习C++的基本成分。在每章中,您都将创建多个程序,它们演示了C++语言和编程技巧。

问:文本编辑器和字处理器有何不同?

答:文本编辑器生成纯文本文件,只包含字母、数字、空格和标点。它没有设置格式的命令,如粗体、斜体、行对齐、边距等。C++源代码不需要这些格式,如果使用字处理器,它可能在文件中存储编译器无法识别的东西。如果您无法编译程序Motto且使用的是字处理器,请尝试使用更简单的编辑器,如Windows“写字板”或Notepad++,看看能否解决问题。

问:我使用的编译器内置了编辑器,可使用它吗?

答:听起来您使用的是集成开发环境(IDE)——一种提高程序编写、调试和测试速度的图形界面工具。诸如Microsoft Visual Studio等复杂编译器包含完整的IDE,让程序员能够访问帮助文件、就地编辑和编译代码以及在不离开IDE的情况下解决编译和链接错误。这是一种更好的C++程序编写方式,但仅当您知道如何使用IDE时才如此。在学习C++的同时,还要学习IDE的方方面面太难了。这就是本书推荐使用GCC的原因,它简单、功能强大,还是免费的。

问:能否不理会编译器发出的警告消息?

答:绝对不能。当编译器发现代码的功能可能并非您的本意时,将发出警告。最好留意这些警告,并通过必要的修改消除它们。出现错误消息意味着编译器不知道如何将您编写的代码转换为机器语言,而警告意味着可以转换,但转换方式可能与您期望的不同。

输入、编译、链接并执行您的第一个程序后,您将能够回答几个问题并完成两个练习,以巩固编译器方面的知识。

1.哪种工具将C++源代码转换为目标代码?

  A.编译器

  B.链接器

  C.集成开发环境

2.最常用的源代码文件扩展名是什么?

  A..cpp

  B..c

  C..h

3.可使用哪些工具来编辑源代码?

  A.文本编辑器

  B.字处理器

  C.两者都行

1.A。编译器接受C++源代码文件,并将其转换为目标代码。链接器将该目标文件和其他必要的目标文件链接起来,创建一个可执行程序。

2.A。编译器可处理任何源代码文件,而不管其扩展名是什么,但.cpp被广泛用作C++ 代码的文件扩展名。使用这种扩展名让您以后能更容易识别程序的源代码。

3.C。可使用任何可将代码存储为纯文本的工具。您可使用操作系统自带的简单编辑器,如“写字板”、Vi、Gedit或Emacs,还可使用其他编辑器,如前面提及的Notepad++。

1.修改程序Motto,使其显示文本“Saluton Mondo!”,这是问候语“Hello world!”的世界语版本。

2.如果您没有C++ IDE且不习惯使用命令行,请看看NotePad++、NetBeans(http://netbeans.org)或Code::Blocks(http://codeblocks.org)。它们都是免费的IDE,可进行配置使其与GCC协同工作。阅读本书时,您可能发现它们使用起来更容易。

这些练习的答案请参阅本书配套网站,其网址为http://cplusplus.cadenhead.org


本章介绍如下内容:

虽然已面世37年,但是C++编程语言的地位比20世纪70年代末出现的其他东西高得多。当前C++仍在风行,还是一种世界级编程语言。

造就它令人惊讶的生命力的原因在于,通过使用C++,只需编写少量的代码,就可创建快速执行的程序,且可在各种计算环境下运行。当今的C++编程功能让您能够生成功能强大的复杂应用程序,适用于商业、商务和开源开发。

在计算时代持续的70年中,计算机编程语言得到了长足发展。C++被认为是对1972年面世的C语言的革命性改进。

最早的程序员使用最原始的计算机指令:机器语言,这些指令用一长串1和0表示。后来,人们发明了汇编语言,它们将机器指令映射到人类能阅读且易于管理的命令,如ADD和MOV。

组成计算机程序的指令称为源代码。

随后出现了高级语言,如BASIC和COBOL,这些语言让程序员能够使用类似于实际单词或句子的语言编写程序,如Let Average = .366。然后,由称为解释器或编译器的工具将这些指令转换为机器语言。

基于解释器的语言每次读取一行代码,并将指令进行转换。

基于编译器的语言通过编译将程序转换为目标代码,这些代码存储在目标文件中。然后,由链接器将目标文件转换为可在操作系统上运行的可执行程序。

由于解释器在代码编写时读取它,并动态地执行代码,因此对程序员来说更容易使用。编译器要求程序员执行不那么方便的编译和链接步骤,但好处是运行速度比解释器运行的程序快得多。

多年来,程序员的目标是编写可快速执行的简短代码。程序必须很小,因为内存昂贵;其运行速度也必须快,因为处理能力的要求也很苛刻。随着计算机价格越来越便宜、速度越来越快、处理能力越来越强大,而内存的容量越来越大、价格越来越便宜,因此,这些制约因素已不再重要。

当前,最大的编程开销是程序员的时间成本。诸如C++等现代语言使得编写结构良好、易于维护的程序更容易,而且这些程序还可扩展和改进。

随着编程语言的发展,出现了满足不同编程风格的语言。

在过程型编程中,程序被设计为一系列操作,这些操作对一组数据进行处理。结构化编程的出现为组织这些过程和管理大量数据提供了一种系统性方法。

结构化编程的主要思想是分而治之。对于程序要执行的任务,如果太复杂,则将其划分为一组更小的任务。如果这些任务还太复杂,则进一步划分成更小的任务。最终的目标是,任务足够小,足够独立,易于理解。

例如,假设有出版商请您编写一个程序,以跟踪其天才横溢、魅力四射的计算机图书作者小组的平均收入,可将这项工作划分成如下子任务。

(1)找出每位作者的收入。

(2)计算出版商有多少作者。

(3)计算这些作者的总收入。

(4)将总收入除以作者数。

计算总收入又可做如下划分。

(1)获取每位作者的个人记录。

(2)获悉作者的预付款和版税。

(3)扣除咖啡的费用、治疗眼睛疲劳的费用以及脊椎保健的费用。

(4)将其收入加入总收入。

(5)获取下一位作者的个人记录。

获取作者记录的任务又可进一步划分为如下子任务。

(1)打开存储作者记录的文件夹。

(2)选择正确的记录。

(3)从磁盘读取数据。

虽然结构化编程得到了广泛应用,但这种方法也存在一些缺点。随着数据量的增加,将数据与操作数据的任务分开将更难。使用数据要做的事情越多,程序越令人感到迷惑。

过程型程序员经常发现自己为解决问题而重新寻求新的解决方案,而不是编写可重用的程序。重用性基于的理念是,创建程序组件,需要时将其插入程序中。这种方法模拟了现实世界。在现实世界中,使用已制造好的零件组装成设备,这些零件执行特定的任务,因此自行车设计师无须从头开始制作刹车;相反,他可将现有的刹车融合到设计中,以利用其功能。

在面向对象编程面世前,计算机程序员无法使用这种基于组件的方法。

面向对象编程(OOP)是一种革命性的编程风格,正是C++让它得以大行其道。

从本质上说,面向对象编程就是将数据和操作数据的过程视为一个对象:一个有身份和特征的独立实体。

C++全面支持面向对象编程,包括面向对象开发的三个支柱概念:封装、继承和多态。

1.封装

前面说到,自行车工程师在设计新车时,他将各个组件组合起来,如车架、手把、车轮和前灯。每个组件都有一些属性,能够完成一些行为。他不用了解前灯的工作原理就能使用,只要知道它是做什么用的即可。

为了实现这个目标,前灯必须是独立的,它必须完成明确的任务,并且全面完成。全面完成一项任务称为封装。

前灯的所有属性都封装在headlight对象中,而不是遍布整辆自行车。

C++支持通过创建用户定义的类型来封装属性,这种类型称为类。定义良好的类是一个完全封装的实体,要么使用整个实体,要么不使用。使用定义良好的类时,程序不需要知道其工作原理,根据这一原则,应隐藏类的内部工作原理。程序员只需知道如何使用它即可。如何创建类将在第8章介绍。

2.继承和重用

下面更深入地了解自行车工程师,假设他名为Penny Farthing。Penny要让新设计的自行车快速投放市场:他欠了一屁股债,这些债主可没有耐心。

鉴于时间紧迫,Penny决定对一款现有的自行车进行改进,给它添加杯托和里程表等新部件,推出一款有额外功能的改进型新车。他重用了普通自行车的所有部件,同时添加了新部件,以拓展其用途。

C++通过继承来支持重用的概念。可将新类型声明为现有类型的扩展,新子类称为继承了现有类型。Penny设计的自行车继承了老式普通自行车,因此具备其所有品质,但根据需要添加了新功能。有关继承及其应用将在第16章讨论。

3.多态

作为最后一个卖点,Penny Farthing设计的Amazo-Bicycle牌自行车的铃铛的行为与众不同,不是像病鸭那样叫,而是轻按时像汽车喇叭,重按时像雾号。铃铛根据骑车人如何使用它发出正确的叫声。

为了支持这种不同对象做相应事情的概念,C++使用了称为函数多态和类多态的功能。 多态指的是同一样东西有多种形态,这将在第17章讨论。

通过学习C++,您将全面了解面向对象编程。等您阅读完本书并开始开发C++程序时,将熟悉这些概念。

本书不介绍如何设计自行车,也不介绍从债务缠身的状态下走出来。

您在第1章创建的程序Motto.cpp包含C++程序的基本框架。程序清单2.1再次列出了该程序的源代码,以便详细探索。

在编程编辑器(如NetBeans)中输入该程序时,记住不要包含其中的编号,提供它们旨在方便引用代码行。

程序清单2.1 Motto.cpp的完整源代码

1: #include <iostream>
2:
3: int main()
4: {
5:     std::cout << "Solidum petit in profundis!\n";
6:     return 0;
7: }

这个程序生成一行输出——奥尔胡斯大学的校训:

Solidum petit in profundis!

在程序清单2.1中,第 1 行包含了一个名为iostream的文件,导致编译器认为在这个地方输入的是文件iostream的全部内容。

C++编译器执行的第一项操作是,调用另一个被称为预处理器的工具对源代码进行检查,这是在编译器每次运行时自动进行的。

在第1行,第一个字符是符号#,它指出这行是一个将由预处理器处理的命令。这些命令称为预处理器编译指令。预处理器的职责是,阅读代码,查找编译指令并根据编译指令相应地修改代码。修改后的代码将提供给编译器。

预处理器相当于编译前的代码编辑,每条编译指令都是一个命令,告诉这位编辑如何做。

编译指令#include告诉预处理器,将指定文件的全部内容加入到程序的指定位置。第1章说过,C++提供了一个标准的源代码库,您可在程序中使用它们来执行有用的功能。文件iostream中的代码支持输入输出任务,如在屏幕上显示信息以及从用户那里接受输入。

文件名iostream前后的<>告诉预处理器,前往一组标准位置寻找该文件。由于这些尖括号,预处理器将前往为编译器存储头文件的文件夹中查找文件iostream。这些文件也被称为包含文件,因为它们被包含在源代码中。

在第1行,将插入文件iostream的全部内容。


注意:传统上,头文件的扩展名为.h,也被称为h文件,因此使用的编译指令类似于include <iostream.h>。

较新的编译器不要求指定扩展名,但是,如果引用了使用扩展名的文件,编辑指令出于兼容性考虑仍然会奏效。本书在包含文件中会省略不必要的.h。

在第5行,命令cout使用了文件iostream的内容,该命令在屏幕上显示信息。

在上述源代码中,没有其他的编译指令,因此Motto.cpp的其他代码由编译器处理。

实际的程序从第3行开始,它声明了一个名为main()的函数。函数是执行一个或多个相关操作的代码块,它执行某些操作后返回到调用它的位置。

每个C++程序都包含一个main()函数,程序运行时将自动调用main()。

在C++中,所有函数都必须在完成任务后返回一个值。函数main()总是返回一个整数,这是使用关键字int指定的。

与C++程序中的其他代码块一样,函数也包含在{和}内。所有函数都以左大括号{开头,并以右大括号}结尾。

在程序Motto.cpp中,函数main()的大括号位于第4行和第7行。大括号内的所有代码都是函数的组成部分。

在第5行,使用命令cout在屏幕上显示了一条消息。在该对象前面,使用了std::对其进行限定,告诉编译器使用标准C++输入输出库。就现在而言,有关这方面的工作原理太复杂,如果在这里介绍,很可能导致您将本书丢得老远。为他人的安全着想,这些内容将在本书后面介绍。就现在而言,将std::cout视为在程序中用于处理输出的对象的名称,而将std::cin视为用于处理用户输入的对象即可。

在第5行,std::cout后面是<<,它被称为输出重定向运算符。运算符是代码行中根据某种信息执行操作的字符。运算符<<显示它后面的信息(仅限当前行)。在第5行,文本“Solidum petit in profundis!\n”用双引号括起来了,这将在屏幕上显示一个字符串,末尾的特殊字符\n表示换行符,导致接下来的程序输出从下一行开始。

在第6行,程序返回整数0。程序运行完毕后,操作系统将收到这个值。通常,程序返回0表示它运行成功,而返回其他数字表示出现了某种故障。

第7行的右大括号表示函数main()到此结束,而程序也到此结束。所有程序的基本框架都与这里演示的相同。

在您编写程序时,每行源代码的功能显而易见,但随着时间的流逝,再回过头来修复程序Bug或添加新功能时,可能发现对自己以前做的工作感到一头雾水。

为了避免这种困境,并帮助他人理解您编写的程序,可在源代码中添加注释。注释是阐述程序做什么的文本,编译器对其置之不理,因此只能给阅读代码的人带来好处。

在C++中,有两种类型的注释。单行注释以两个斜杠(//)打头,导致编译器忽略从这里开始到行尾的全部内容,下面是一个例子:

// The next line is a kludge (ugh!)

多行注释以斜杠和星号(/*)打头,并以星号和斜杠(*/)结尾。/*和*/之间的所有内容都是注释,哪怕它们占据多行。如果程序中不存在与*/配套的/*,编译器将视之为错误。下面是一个多行注释:

/* This part of the program doesn't work very well. Please remember to
   fix this before the code goes live –– or else find a scapegoat you can
   blame for the problem. The new guy Curtis would be a good choice. */

在上述注释中,为了提高可读性而将文本左对齐,但并非必须这样,因为编译器忽略/*和*/之间的所有内容。在这里,可包含任何内容:杂货清单、情诗、从未告诉过别人的秘密等。


警告:关于多行注释,需要牢记的一个重点是,不能将其嵌套。如果您使用/*开始注释,并在几行后又使用了一个/*,则编译器见到第一个*/后,将认为多行注释到此结束,这样第二个*/将导致编译器错误。大多数C++编辑器都以不同的颜色显示注释,让注释的开始和结束位置非常清晰。

在稍后您将创建的项目中,包含了这两种类型的注释。请在程序中添加大量注释,您为解释代码的功能而在编写注释上花的时间越多,几周、几月甚至几年后,代码就越容易理解。

main()是独特的C++函数,因为程序开始运行时将自动调用它。

程序从函数main()开头开始,逐行执行源代码。调用函数时,程序将转而执行该函数,函数执行完毕后,将返回到调用函数的代码行。函数可能返回值,也可能不返回,但函数main()是个例外,它总是返回一个整数。

函数由函数头和函数体组成,其中函数头包含以下三项内容:

函数名是一个简短的标识符,描述了函数的功能。

函数不返回值时,使用返回类型void,表示空。需要说明的是,void并非毫无意义,它表示“什么都没有”。

实参是传递给函数的数据,控制函数做什么。收到的实参值存储在形参中;函数可接受零个、一个或多个形参。在接下来您将创建的程序中,有一个名为add()的函数,它将两个数相加。下面是这个函数的声明:

int add(int x, int y)
{
    // body of function goes here
}

形参放在括号内,用逗号分隔,构成形参列表。在这个函数中,形参为x和y,它们的类型都为整型。

函数的名称、形参及其排列顺序被称为签名,就像人的签名,函数的签名也唯一地标识了它。

没有形参的函数包含一组空括号,如下所示:

int getServerStatus()
{
   // body of function here
}

函数名不能包含空格,因此在函数getServerStatus()中,除第一个单词外,其他每个单词的首字母都大写。这种命名规则在C++程序员中很流行,本书也采用它。

函数体由左大括号、零或多条语句以及右大括号组成。返回值的函数使用return语句,如程序Motto中所示:

return 0;

return语句导致函数结束。如果函数不包含return语句,将自动在函数体末尾返回void。在这种情况下,必须将函数的返回类型指定为void。

在程序清单2.2所示的程序Calculator.cpp中,充实了前面提到的函数add(),使用它将两个数相加并显示结果。这个程序演示了如何创建一个函数,它接受两个整型参数并返回一个整型值。

程序清单2.2 Calculator.cpp的完整源代码

 1: #include <iostream>
 2:
 3: int add(int x, int y)
 4: {
 5:     // add the numbers x and y together and return the sum
 6:     std::cout << "Running calculator ...\n";
 7:     return (x+y);
 8: }
 9:
10: int main()
11: {
12:     /* this program calls an add() function to add two different
13:        sets of numbers together and display the results. The
14:        add() function doesn't do anything unless it is called by
15:        a line in the main() function. */
16:     std::cout << "What is 867 + 5309?\n";
17:     std::cout << "The sum is " << add(867, 5309) << "\n\n";
18:     std::cout << "What is 777 + 9311?\n";
19:     std::cout << "The sum is " << add(777, 9311) << "\n";
20:     return 0;
21: }

该程序的输出如下:

What is 867 + 5309?
Running calculator ...
The sum is 6176

What is 777 + 9311?
Running calculator ...
The sum is 10088

在第5行,程序Calculator包含一个单行注释,第12~15行包含一个多行注释。所有注释都会被编译器忽略。

函数add()接受两个整型形参:x和y,并在一条return语句中将它们相加(第3~8行)。

程序从main()函数开始执行,其中的第一条语句(第16行)使用对象std::cout和重定向运算符<<显示文本“What is 867 + 5309?”,再换行。

下一行代码显示文本“The sum is”,调用函数add() 并给它传递实参867和5309。这样,程序将执行函数add(),从输出中的“Running calculator....”文本可以知道这一点。

显示这个函数返回的值后,换行两次。

第18~19行重复这个过程。

公式(x+y)是一个表达式,第4章将介绍如何创建表达式。

本章介绍了C++是从其他计算机语言风格发展而来的,并支持被称为面向对象编程的方法。这种方法在计算领域获得了巨大成功,让C++在今天与在1979年面世时一样,一点也不落伍。

在本章开发的两个程序中,您使用了C++程序的三个组成部分:预处理器编译指令、注释和函数。

您将使用C++开发的所有程序使用的基本框架都与程序Motto和Calculator相同,只是随着使用的函数增多,它们将变得更为复杂,无论这些函数是您自己编写的,还是来自编译指令#include包含的头文件。

问:在C++程序中,字符#有何用途?

答:#符号指出当前代码行是一个编译指令:需要由程序编译器处理的命令。编译指令#include将指定文件的所有内容插入到当前位置。编译器看不到编译指令,相反,结果就像是在指定位置输入了文件的全部内容一样。

问:注释类型///*有何不同?

答:以//打头的注释是单行注释,到当前行行尾结束。以/*打头的注释是多行注释,到下一个*/处才结束。函数结束不会导致多行注释结束,只有添加了*/标志,多行注释才会结束,否则编译器将报错。

问:形参和实参有何不同?

答:这些术语说的是函数调用过程的两端。实参是传递给函数的信息,形参是函数收到的信息。调用函数时,提供的是实参,而在函数内部,这些收到的实参值存储在形参中。

了解C++程序的组成部分后,您将能够回答几个问题并完成两个练习,以巩固所学的知识。

1.函数main()的返回类型是什么?

  A.void

  B.int

  C.它不返回值

2.在C++程序中,大括号有何作用?

  A.指出函数的开头和结尾

  B.指出程序的开头和结尾

  C.强化程序的牙齿

3.下面哪项不是函数签名的组成部分?

  A.函数名

  B.实参

  C.返回类型

1.B。函数main()返回一个整数。

2.A。大括号标识函数以及接下来几章将介绍的其他代码块的开头和结尾。

3.函数签名由函数名、形参及其排列顺序组成,而不包含函数的返回类型。

1.改写程序Motto,使其在一个函数中显示奥尔胡斯大学的校训。

2.改写程序Calculator,给函数add()添加第三个整型参数z,并调用这个函数两次。

这些练习的答案请参阅本书配套网站,其网址为http://cplusplus.cadenhead.org


相关图书

代码审计——C/C++实践
代码审计——C/C++实践
CMake构建实战:项目开发卷
CMake构建实战:项目开发卷
C++ Templates(第2版)中文版
C++ Templates(第2版)中文版
C/C++代码调试的艺术(第2版)
C/C++代码调试的艺术(第2版)
计算机图形学编程(使用OpenGL和C++)(第2版)
计算机图形学编程(使用OpenGL和C++)(第2版)
Qt 6 C++开发指南
Qt 6 C++开发指南

相关文章

相关课程