- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
前言
学习 C++是一次探索之旅,因为这种语言容纳了好几种编程范式,其中包括面向对象编程、泛型编程和传统的过程化编程。本书第 5 版是基于 ISO C++标准编写的,该标准的官方名称为 C++99 和 C++03(C++99/C++03),其中 2003 标准主要是对 1999 标准的技术修正,并没有添加任何新功能。C++在不断发展,编写本书时,新标准获得了 C++国际标准委员会的批准。在制定期间,该标准名为 C++0x,但现已改名为 C++11。大多数编译器都能很好地支持 C++99/03,而本书的大多数示例都遵守该标准。有些实现中已显现了新标准的很多功能,而本书也对这些新功能进行了探索。
本书在介绍 C++特性的同时,讨论了基本 C 语言,使两者成为有机的整体。书中介绍了 C++的基本概念,并通过短小精悍的程序来阐明,这些程序都很容易复制和试验。书中还介绍了输入和输出,如何让程序执行重复性任务,如何让程序做出选择,处理数据的多种方式,以及如何使用函数等内容。另外,本书还讲述了 C++在 C 语言的基础上新增的很多特性,包括:
- 类和对象;
- 继承;
- 多态、虚函数和 RTTI(运行阶段类型识别);
- 函数重载;
- 引用变量;
- 泛型(独立于类型的)编程,这种技术是由模板和标准模板库(STL)提供的;
- 处理错误条件的异常机制;
- 管理函数、类和变量名的名称空间。
初级教程方法
大约 20 年前,《C Primer Plus》开创了优良的初级教程传统,本书建立在这样的基础之上,吸收了其中很多成功的理念。
- 初级教程应当是友好的、便于使用的指南。
- 初级教程不要求您已经熟悉相关的编程概念。
- 初级教程强调的是动手学习,通过简短、容易输入的示例阐述一两个概念。
- 初级教程用示意图来解释概念。
- 初级教程提供问题和练习来检验您对知识的理解,从而适于自学或课堂教学。
基于上述理念,本书帮助您理解这种用途广泛的语言,并学习如何使用它。
- 对何时使用某些特性,例如何时使用公共继承来建立 is-a 关系,提供了概念方面的指导。
- 阐释了常用的 C++编程理念和技术。
- 提供了大量的附注,如提示、警告、注意等。
本书的作者和编辑尽最大的努力使本书简单、明了、生动有趣。我们的目标是,您阅读本书后,能够编写出可靠、高效的程序,并且觉得这是一种享受。
示例代码
本书包含大量的示例代码,其中大部分是完整的程序。和前一版一样,本书介绍的是通用 C++,因此适用于任何计算机、操作系统和编译器。书中的示例在 Windows 7 系统、Macintosh OS X 系统和 Linux 系统上进行了测试。
使用了 C++11 功能的程序要求编译器支持这些功能,但其他程序可在遵循 C++ 99/03 的任何系统上运行。
书中完整程序的源代码可从配套网站下载,详情请参阅封底的链接信息。
本书内容
本书分为 18 章和 10 个附录。
- 第 1 章 预备知识:本章介绍 Bjarne Stroustrup 如何通过在 C 语言的基础上添加对面向对象编程的支持,来创造 C++编程语言。讨论面向过程语言(如 C 语言)与面向对象语言(如 C++)之间的区别。您将了解 ANSI/ISO 在制定 C++标准方面所做的工作。本章还讨论了创建 C++程序的技巧,介绍了当前几种 C++编译器使用的方法。最后,本章介绍了本书的一些约定。
- 第 2 章 开始学习 C++:本章介绍创建简单 C++程序的步骤。您可以学习到 main( ) 函数扮演的角色以及 C++程序使用的一些语句。您将使用预定义的 cout 和 cin 对象来实现程序输出和输入,学习如何创建和使用变量。最后,本章还将介绍函数——C++的编程模块。
- 第 3 章 处理数据:C++提供了内置类型来存储两种数据:整数(没有小数的数字)和浮点数(带小数的数字)。为满足程序员的各种需求,C++为每一种数据都提供了几个类型。本章将要讨论这些类型,包括创建变量和编写各种类型的常量。另外,还将讨论 C++是如何处理不同类型之间的隐式和显式转换的。
- 第 4 章 复合类型:C++让程序员能够使用基本的内置类型来创建更复杂的类型。最高级的形式是类,这将在第 9 章~第 13 章讨论。本章讨论其他形式,包括数组(存储多个同类型的值)、结构(存储多个不同类型的值)、指针(标识内存位置)。您还将学习如何创建和存储文本字符串及如何使用 C-风格字符数组和 C++ string 类来处理文本输入和输出。最后,还将学习 C++处理内存分配的一些方法,其中包括用于显式地管理内存的 new 和 delete 运算符。
- 第 5 章 循环和关系表达式:程序经常需要执行重复性操作,为此 C++提供了 3 种循环结构:for 循环、while 循环和 do while 循环。这些循环必须知道何时终止,C++的关系运算符使程序员能够创建测试来引导循环。本章还将介绍如何创建逐字符地读取和处理输入的循环。最后,您将学习如何创建二维数组以及如何使用嵌套循环来处理它们。
- 第 6 章 分支语句和逻辑运算符:如果程序可以根据实际情况调整执行,我们就说程序能够智能地行动。在本章,您将了解到如何使用 if、if else 和 switch 语句及条件运算符来控制程序流程,学习如何使用逻辑运算符来表达决策测试。另外,本章还将介绍确定字符关系(如测试字符是数字还是非打印字符)的函数库 cctype。最后,还将简要地介绍文件输入/输出。
- 第 7 章 函数——C++的编程模块:函数是 C++的基本编程部件。本章重点介绍 C++函数与 C 函数共同的特性。具体地说,您将复习函数定义的通用格式,了解函数原型是如何提高程序可靠性的。同时,还将学习如何编写函数来处理数组、字符串和结构。还要学习有关递归的知识(即函数在什么情况下调用自身)以及如何用它来实现分而治之的策略。最后将介绍函数指针,它使程序员能够通过函数参数来命令函数使用另一个函数。
- 第 8 章 函数探幽:本章将探索 C++中函数新增的特性。您将学习内联函数,它可以提高程序的执行速度,但会增加程序的长度;还将使用引用变量,它们提供了另一种将信息传递给函数的方式。默认参数使函数能够自动为函数调用中省略的函数参数提供值。函数重载使程序员能够创建多个参数列表不同的同名函数。类设计中经常使用这些特性。另外,您还将学习函数模板,它们使程序员能够指定相关函数族的设计。
- 第 9 章 内存模型和名称空间:本章讨论如何创建多文件程序,介绍分配内存的各种方式、管理内存的各种方式以及作用域、链接、名称空间,这些内容决定了变量在程序的哪些部分是可见的。
- 第 10 章 对象和类:类是用户定义的类型,对象(如变量)是类的实例。本章介绍面向对象编程和类设计。对象声明描述的是存储在对象中的信息以及可对对象执行的操作(类方法)。对象的某些组成部分对于外界来说是可见的(公有部分),而某些部分却是隐藏的(私有部分)。特殊的类方法(构造函数和析构函数)在对象创建和释放时发挥作用。在本章中,您将学习所有这些内容以及其他类知识,了解如何使用类来实现 ADT,如栈。
- 第 11 章 使用类:在本章中,您将深入了解类。首先了解运算符重载,它使程序员能够定义与类对象一起使用的运算符,如+。还将学习友元函数,这些函数可以访问外部世界不可访问的类数据。同时还将了解一些构造函数和重载运算符成员函数是如何被用来管理类类型转换的。
- 第 12 章 类和动态内存分配:一般来说,让类成员指向动态分配的内存很有用。如果程序员在类构造函数中使用 new 来分配动态内存,就有责任提供适当的析构函数,定义显式拷贝构造函数和显式赋值运算符。本章介绍了在程序员没有提供显式定义时,将如何隐式地生成成员函数以及这些成员函数的行为。您还将通过使用对象指针,了解队列模拟问题,扩充类方面的知识。
- 第 13 章 类继承:在面向对象编程中,继承是功能最强大的特性之一,通过继承,派生类可以继承基类的特性,可重用基类代码。本章讨论公有继承,这种继承模拟了 is-a 关系,即派生对象是基对象的特例。例如,物理学家是科学家的特例。有些继承关系是多态的,这意味着相同的方法名称可能导致依赖于对象类型的行为。要实现这种行为,需要使用一种新的成员函数——虚函数。有时,使用抽象基类是实现继承关系的最佳方式。本章讨论了这些问题,说明了公有继承在什么情况下合适,在什么情况下不合适。
- 第 14 章 C++中的代码重用:公有继承只是代码重用的方式之一。本章将介绍其他几种方式。如果一个类包含了另一个类的对象,则称为包含。包含可以用来模拟 has-a 关系,其中一个类包含另一个类的对象。例如,汽车有马达。也可以使用私有继承和保护继承来模拟这种关系。本章说明了各种方法之间的区别。同时,您还将学习类模板,它让程序员能够使用泛型定义类,然后使用模板根据具体类型创建特定的类。例如,栈模板使程序员能够创建整数栈或字符串栈。最后,本章还将介绍多重公有继承,使用这种方式,一个类可以从多个类派生而来。
- 第 15 章 友元、异常和其他:本章扩展了对友元的讨论,讨论了友元类和友元成员函数。然后从异常开始介绍了 C++的几项新特性。异常为处理程序异常提供了一种机制,如函数参数值不正确或内存耗尽等。您还将学习 RTTI,这种机制用来确定对象类型。最后,本章还将介绍一种更安全的方法来替代不受限制的强制类型转换。
- 第 16 章 string 类和标准模板库:本章讨论 C++语言中新增的一些类库。对于传统的 C-风格字符串来说,string 类是一种方便且功能强大的替代方式。Auto_ptr 类帮助管理动态分配的内存。STL 提供了几种类容器(包括数组、队列、链表、集合和映射)的模板表示。它还提供了高效的泛型算法库,这些算法可用于 STL 容器,也可用于常规数组。模板类 valarray 为数值数组提供了支持。
- 第 17 章 输入、输出和文件:本章复习 C++ I/O,并讨论如何格式化输出。您将要学习如何使用类方法来确定输入或输出流的状态,了解输入类型是否匹配或是否检测到了文件尾。C++使用继承来派生用于管理文件输入和输出的类。您将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得对文件的随机访问权。最后,还将学习如何使用标准的 I/O 方法来读取和写入字符串。
- 第 18 章 探讨 C++新标准:本章首先复习之前介绍过的几项 C++11 新功能,包括新类型、统一的初始化语法、自动类型推断、新的智能指针以及作用域内枚举。然后,讨论新增的右值引用类型以及如何使用它来实现移动语义。接下来,介绍了新增的类功能、lambda 表达式和可变参数模板。最后,概述了众多其他的新功能。
- 附录 A 计数系统:本附录讨论八进制数、十六进制数和二进制数。
- 附录 B C++保留字:本附录列出了 C++关键字。
- 附录 C ASCII 字符集:本附录列出了 ASCII 字符集及其十进制、八进制、十六进制和二进制表示。
- 附录 D 运算符优先级:本附录按优先级从高到低的顺序列出了 C++的运算符。
- 附录 E 其他运算符:本附录总结了正文中没有介绍的其他 C++运算符,如按位运算符等。
- 附录 F 模板类 string:本附录总结了 string 类方法和函数。
- 附录 G 标准模板库方法和函数:本附录总结了 STL 容器方法和通用的 STL 算法函数。
- 附录 H 精选读物和网上资源:本附录列出一些参考书,帮助您深入了解 C++。
- 附录 I 转换为 ISO 标准 C++:本附录提供了从 C 和老式 C++实现到标准 C++的转换指南。
- 附录 J 复习题答案:本附录提供各章结尾的复习题的答案。
对教师的提示
本书宗旨之一是,提供一本既可用于自学又可用于教学的书籍。下面是本书在支持教学方面的一些特征。
- 本书介绍的是通用 C++,不依赖于特定实现。
- 本书内容跟踪了 ISO/ANSI C++标准委员会的工作,并讨论了模板、STL、string 类、异常、RTTI 和名称空间。
- 本书不要求学生了解 C 语言,但如果有一定的编程经验则更好。
- 本书内容经过了精心安排,前几章可以作为对 C 预备知识的复习一带而过。
- 各章都有复习题和编程练习。附录 J 提供了复习题的答案。
- 本书介绍的一些主题很适于计算机科学课程,包括抽象数据类型(ADT)、栈、队列、简单链表、模拟、泛型编程以及使用递归来实现分而治之的策略。
- 各章都非常简短,用一周甚至更短的时间就可以学完。
- 本书讨论了何时使用具体的特性以及如何使用它们。例如,把 is-a 关系的公有继承同组合、has-a 关系的私有继承联系起来,讨论了何时应使用虚函数以及何时不应使用。
本书约定
为区别不同类型的文本,我们使用了一些印刷上的约定。
- 代码行、命令、语句、变量、文件名和程序输出使用 courier new 字体:
- 用户需要输入的程序输入用粗体表示:
- 语法描述中的占位符用斜体表示。您应使用实际的文件名、参数等替换占位符。
- 新术语用斜体表示。
旁注:提供更深入的讨论和额外的背景知识,帮助阐明主题。
提示:提供特定编程情形下很有帮助的简单指南。
警告:指出潜在的陷阱。
注意:提供不属于其他类别的各种说明。
开发本书编程示例时使用的系统
本书的 C++11 示例是使用 Microsoft Visual C++ 2010 和带 Gnu g++ 4.5.0 的 Cygwin 开发的,它们都运行在 64 位的 Windows 7 系统上。其他示例在这些系统上进行了测试,还在 OS X 10.6.8 系统和 Ubuntu Linux 系统上分别使用 g++ 4.21 和 g++ 4.4.1 进行了测试。大多数非 C++11 示例最初都是在 Windows XP Professional 系统上使用 Microsoft Visual C++ 2003 和 Metrowerks CodeWarrior Development Studio 9 开发的,并在该系统上使用 Borland C++ 5.5 命令行编译器和 GNU gpp 3.3.3 进行了测试;其次,在运行 SuSE 9.0 Linux 的系统上使用 Comeau 4.3.3 和 GNU g++3.3.1 进行了测试;最后,在运行 OS 10.3 的 Macintosh G4 上使用 Metrowerks Development Studio 9 进行了测试。
C++为程序员提供了丰富多彩的内容。祝您学习愉快!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论