图书前言

前言

欢迎来到C++计算机编程语言的世界。我们相信,本书将为你开启一段信息丰富、充满挑战并富有趣味的C++学习之旅。本书根据ACM(国际计算机学会)和IEEE(电气电子工程师学会)两大权威机构的课程设置建议编写计算机课程体系联合工作组,ACM,IEEE计算机学会.Computer Science Curricula 2013 Curriculum Guidelines for Undergraduate Degree Programs in Computer Science,2013年12月20日.,以友好的方式介绍前沿的计算技术,非常适合作为大学入门课程的教材。

本书的核心是Deitel标志性的实时编码(livecode)方法,即大部分概念在完整的、可运行的程序环境中介绍,并附上执行样例,而非仅通过代码片段呈现。为了顺利运行书中数百个示例程序,请阅读“前言”之后的“准备工作”部分,了解如何配置Linux、Windows或macOS本书写作时仍为Apple OS X系统。等操作系统的计算机。请使用我们提供的源代码来运行每个程序。

联系作者

在阅读本书时,如果有任何疑问,可以发送邮件至deitel@deitel.com联系我们,我们会及时回复。如需了解本书的最新更新信息,请访问http://www.deitel.com/books/cpphtp10。

C++11与C++14标准本书写作时最新标准是C++14。

这是一个激动人心的时代,各种主流编程语言竞相发展,以跟上日新月异的编程技术。回顾C++在2011年之前的30年的发展历程,仅推出了几个新版本。现在,ISO C++标准委员会承诺将每3年发布一次新标准,同时,编译器供应商也在迅速集成这些新特性。本书便是基于2011年和2014年分别发布的C++11和C++14标准编写的。

C++17目前正处于积极的开发阶段。本书中所有C++11与C++14的特性均会在页边分别标注“11”与“14”的图标,就像在本页看到的一样。图0.1列出了本书会讨论的77个C++11和C++14的特性。

第3章

类内初始化器

第4章

C++11中的新关键字

第5章

long long int类型

第6章

非确定性随机数生成

作用域枚举

指定枚举常量的类型

unsigned long long int

在数字字面量中使用单引号分隔数字组(C++14)

第7章

array容器

用于类型推导的auto

使用列表初始化vector

基于范围的for语句

第8章

begin/end函数

nullptr

第9章

委托构造函数

第10章

deleted成员函数

explicit转换运算符

列表初始化动态分配的数组

构造函数调用中的列表初始化器

string对象字面量(C++14)

第11章

final类

final成员函数

继承基类构造函数

第12章

defaulted成员函数

override关键字

第13章

流的bool运算符

第14章

带引号流的操纵符(C++14)

用于文件名的string对象

第15章

cbegin/cend容器的成员函数

模板类型中的编译器修复

crbegin/crend容器的成员函数

forward_list容器

全局函数cbegin/cend、rbegin/rend和crbegin/crend(C++14)

关联容器中的异构查找(C++14)

关联容器中的不可变键

insert容器成员函数返回迭代器

键值对的列表初始化

pairs的列表初始化

返回值列表初始化

shrink_to_fit vector/deque成员函数

第16章

all_of算法

any_of算法

copy_if算法

copy_n算法

接受两个范围的equal算法

(C++14)

find_if_not算法

泛型lambda表达式(C++14)

lambda表达式

具有initializer_list参数的min和max算法

minmax算法

minmax_element算法

接受两个范围的mismatch算法

(C++14)

none_of算法

random_shuffle 已弃用(C++14)

——被shuffle和C++11随机数生成器取代

非成员函数swap

第17章

使用make_unique创建unique_ptr(C++14)

noexcept

unique_ptr智能指针

第18章

函数模板中的默认类型实参

第21章

数值转换函数

第22章

二进制字面量(C++14)

第24章

聚合成员初始化(C++14)

返回类型中的auto和decltype(auto)(C++14)

constexpr的更新(C++14)

decltype

move算法

移动赋值运算符

move_backward算法

移动构造函数

正则表达式

右值引用

shared_ptr智能指针

用于文件名的static_assert对象

函数的尾置返回类型

tuple变参模板

通过类型访问tuple(C++14)

weak_ptr智能指针

图0.1本书中的C++11和C++14特性

本书的主要特点

 遵循C++11标准和C++14标准。

 所有示例代码均在GNU C++本书写作时使用的是GNU C++ 5.2.1。、Microsoft Visual Studio 社区版本书写作时使用的是Visual Studio 2015社区版。和Xcode本书写作时使用的是Xcode 7。中的Apple Clang/LLVM这3种主流的工业级C++14编译器上进行了全面测试。

 智能指针。智能指针提供比内置指针更丰富的功能,有助于防止动态内存管理错误。第17章将讨论unique_ptr,第24章将介绍shared_ptr和weak_ptr。

 提前介绍标准库中的容器、迭代器和算法,并融入了C++11和C++14的特性以增强其功能。第15章和第16章中的标准库容器、迭代器和算法通过新增的C++11和C++14特性得到了增强。对于数据结构的绝大多数需求,可以通过重用这些标准库功能得到满足。至于如何构建自定义的数据结构,将在第19章详细介绍。

 第24章(补充阅读内容): C++11与C++14的附加主题。本章将探讨正则表达式、shared_ptr与weak_ptr智能指针、移动语义、多线程编程、tuple、decltype、constexpr等更多特性(见图0.1)。

 随机数生成、模拟和游戏。为了提高程序的安全性,本书将介绍C++11中的非确定性随机数生成功能。

 指针。全面阐述了内置指针的功能,以及内置指针、C字符串与内置数组之间的密切联系。

 以可视化方式展示了查找算法和排序算法,并简要介绍了大O表示法。

 补充阅读内容包括多个章节(第23~26章)和附录(附录F~J),可以扫描下方二维码获取。

 调试器。补充阅读内容中提供附录H(使用Visual Studio调试器)、附录I(使用GNU C++调试器)和附录J(使用Xcode调试器)。

本版新增内容

 讨论C++14的新功能。

 在代码示例中进一步融合C++11特性,因为最新的编译器已支持这些特性。

 采用列表初始化语法实现统一初始化。

 在控制语句中始终使用花括号,即使主体只有一条语句,示例代码如下: 

if (condition) {

single-statement or multi-statement body

}

 在第3~5章中,分别用Account类、Student类和DollarAmount类的案例研究替换了Gradebook类。DollarAmount类可精确处理商业应用中的货币金额。

 在大数字字面值中使用C++14数字分隔符。

 按照行业惯例,将写作。

 按照行业惯例,将写作。

 采用C++11的作用域枚举替代传统的C枚举。

 书中的术语已与C++标准统一。

 小结中的关键词以粗体突出显示,便于快速查阅。

 删除了[]、()、和{}内的多余空格。

 使用toString成员函数替换大多数print成员函数,以增强类的灵活性。例如,通过返回字符串,客户端代码可以选择将其在屏幕上显示、写入文件或与其他字符串连接等操作。

 使用ostringstream来创建项目(如Time的字符串表示等)的格式化字符串,而不是直接将这些格式化数据输出到标准输出流。

 为简化流程,将原本应在第3章中使用的三文件架构推迟至第9章中使用。因此,在所有早期的类示例中,整个类的定义都被放在了头文件中。

 第24章使用unique_ptr重新实现了第10章介绍的Array类运算符重载示例。使用原生指针及通过new和delete进行动态内存分配易于引发难以察觉的编程错误,特别是“内存泄漏”问题,而unique_ptr和其他智能指针类型则能有效防止此类错误的发生。

 在第16章中,使用lambda表达式取代函数指针。此举旨在使读者熟悉lambda表达式,它们可以与各种标准库算法相结合,从而在C++中实现函数式编程。

 对第24章进行了扩充,纳入了更多的C++14特性。

面向对象编程

 早期对象方法。第1章介绍了对象技术的基本概念和相关术语。第3章将开发第一个自定义类和对象,我们力求使这一章易于初学者理解。尽早介绍对象和类,可以促使你立即开始“思考对象”,并更深入地掌握这些概念。对于需要采用后期对象方法的课程,请参阅我们的C++ How to Program: Late Objects Version一书,该书前6章介绍编程基础(其中两章讲解控制语句),后续7章循序渐进地介绍面向对象编程的概念。

 C++标准库string。C++提供了两种字符串类型: string类对象(从第3章开始使用)和基于指针的C风格字符串。为了增强程序的健壮性,规避C字符串的诸多安全隐患,我们已将大部分的C字符串替换为C++ string类的实例。在本书的后续章节中,我们仍会讨论C字符串,以帮助你更好地应对实际工作中可能遇到的遗留代码问题。但在新的开发项目中,推荐使用string对象。

 C++标准库array。C++提供了3种数组类型: array对象和vector对象(从第7章开始使用),以及基于指针的C风格数组(将在第8章讨论)。在数组处理上,我们主要采用标准库中的array和vector类模板,而非内置的C语言风格的基于指针的数组。我们仍然会介绍内置数组,因为它们在C++中依然有用,这样你就能够阅读遗留代码。在新的开发项目中,推荐使用array和vector类模板对象。

 构建有价值的类。本书的主要目标是让你学会构建实用且可重用的类。第10章对string类模板进行了测试,这样你就可以在实现带有运算符重载的自定义类之前,领略运算符重载的优雅运用。在第10章的案例研究中,你将构建自己的Array类,然后在第18章的练习题中将其转换为类模板。

 面向对象编程的案例研究。我们提供了多个精心设计的现实案例研究,包括第3章的Account类、第4章的Student类、第5章的DollarAmount类、第7章的GradeBook类、第9章的Time类,以及第11、12章的Employee类等。

 可选读的案例研究: 使用UML进行ATM系统的面向对象设计及C++实现。UML是面向对象系统建模的行业标准图形化语言。第25章和第26章包含一个可选读的关于使用UML进行面向对象设计的案例研究,设计并实现了一个简单的ATM(自动取款机)系统。我们对一份说明待建系统的典型需求文档进行仔细分析,确定实现该系统所需要的类、这些类所具有的属性及所要展示的行为,并详细说明这些类的对象必须如何相互作用才能满足系统的需求。根据此设计,我们给出了完整的C++实现。据学生的普遍反馈,该案例研究能帮助他们“融会贯通”,从而真正理解面向对象的概念。

 理解多态性的运行机制。第12章提供了详细的图表和解释,说明C++通常是如何在底层实现多态性、虚函数及动态绑定的。

 面向对象的异常处理。我们在第7章就引入了基本的异常处理。教师可以从第17章中选取更详细的内容进行教学。

 自定义基于模板的数据结构。我们对数据结构进行了多章节的深入探讨。

 3种编程范式。我们讨论了结构化编程、面向对象编程和泛型编程3种编程范式。

数百个代码示例

本书收录了选自计算机科学、信息技术、商业管理、模拟仿真、游戏娱乐和其他主题的示例程序。这些示例适合初级和中级C++课程的学生使用,如图0.2所示。

Account类标准库的数学算法

Array类案例研究maximum函数模板

Author类归并排序程序

银行账户程序multiset类模板

条形图绘制程序内存分配失败时new抛出bad_alloc异常

BasePlusCommissionEmployee类PhoneNumber类

二叉树的创建和遍历投票分析程序

BinarySearch测试程序多态性演示

洗牌和发牌前置自增和后置自增

ClientData类priority_queue适配器类

CommissionEmployee类queue适配器类

比较string对象随机访问文件

编译和连接过程随机数生成

使用for的复利计算递归函数factorial

将string对象转换为C字符串投掷6000万次六面骰子

计数器控制的循环SalariedEmployee类

掷骰子游戏的模拟SalesPerson类

DollarAmount类标准库的查找和排序算法

信用查询程序顺序文件

Date类set类模板

向下类型转换和运行时类型信息shared_ptr程序

Employee类stack适配器类

explicit构造函数Stack类

fibonacci函数栈展开

fill算法标准库string类程序

printArray函数模板的特化流操纵符showbase

generate算法string对象赋值和连接

GradeBook类string类成员函数substr

在声明中初始化一个数组Student类

从istringstream对象进行输入使用for语句对整数求和

迭代法计算阶乘Time类

lambda表达式管理动态内存分配的unique_ptr对象

链表操作使用正则表达式验证用户输入

map类模板vector类模板

图0.2本书示例精选

练习题

 本书提供了丰富的自测练习题(SelfReview Exercises)和答案,方便自学。

 每章都附有大量的练习题(Exercises),涵盖重要术语和概念的复习、识别代码示例中的错误、编写单个程序语句、编写C++类及其成员函数和非成员函数的代码片段、编写完整的程序,以及实现大型项目。图0.3列出了书中部分练习题。此外,还附有创新实践练习题(Making a Difference),这些练习题旨在鼓励你利用计算机和互联网资源去研究和解决有意义的实际问题。

机票预订系统德·摩根定律网络钓鱼扫描器

高级字符串操作掷骰子猪拉丁文(一种简单的字母替换密码)

冒泡排序八皇后问题使用账户层次的多态银行程序

构建自己的编译器应急响应毕达哥拉斯三元组

构建自己的计算机使用加密技术保护隐私薪资计算器

薪资计算Facebook用户基数增长埃拉托斯特尼筛法

CarbonFootprint抽象类: 多态性斐波那契数列简单解密

洗牌和发牌问题油耗计算简单加密

计算机辅助教学全球变暖知识测验SMS语言

计算机辅助教学: 难度等级猜数字游戏垃圾邮件扫描器

计算机辅助教学: 监控学生表现猜字游戏拼写检查器

计算机辅助教学: 减轻学生疲劳健康记录目标心率计算器

计算机辅助教学: 问题分类骑士周游问题税收计划备选方案; 公平税

用更健康的食材烹饪打油诗电话号码数字生成器

掷双骰子游戏的改进迷宫遍历: 随机生成迷宫歌曲The Twelve Days of Christmas

信用额度问题莫尔斯电码龟兔赛跑模拟

纵横字谜游戏生成器工资发放系统修改汉诺塔问题

密码问题Peter Minuit问题世界人口增长分析

图0.3本书练习题精选

插图和表格

书中提供了大量的线绘图、UML图、表格、程序及程序输出结果。图0.4列出了书中部分插图和表格。

主要的正文插图和表格

Account类图

数据层次结构

多个源文件程序的编译和连接

二次多项式的求值顺序

if单分支选择语句活动图

if…else双分支选择语句活动图

while循环语句UML活动图

for循环语句UML活动图

do…while循环语句UML活动图

switch多分支选择语句活动图

C++单入口/单出口控制语句

值传递和引用传递分析

继承层次图

函数调用栈和活动记录

fibonacci函数的递归调用

指针算术运算图

CommunityMember类的继承层次

Shape类的继承层次

public、protected和private继承

Employee层次结构UML类图

虚函数调用机制

两个自引用类对象相互连接

链表的图形化表示

insertAtFront操作的图形化表示

insertAtBack操作的图形化表示

removeFromFront操作的图形化表示

removeFromBack操作的图形化表示

单向循环链表

双向链表

双向循环链表

二叉树的图形化表示

ATM案例研究的插图和表格(选读)

用户角度的ATM系统用例图

表示类间关联的类图

表示组合关系的类图

ATM系统模型的类图

具有属性的类

ATM系统的状态图

余额查询交易的活动图

取款交易的活动图

ATM系统中具有属性和操作的类

执行余额查询的ATM系统通信图

执行余额查询的通信图

对Withdrawal的执行进行建模的顺序图

允许用户在账户间转账的ATM系统改进版的用例图

表示Car类组合关系的类图

包含Deposit类的ATM系统模型的类图

Deposit交易的活动图

对Deposit的执行进行建模的顺序图

图0.4本书插图和表格精选

依赖关系

图0.5揭示了各章之间的依赖关系,有助于教师安排自己的教学计划。

图0.5各章之间的依赖关系

教学方法

本书包含大量示例,强调程序的清晰性,注重构建设计精良的软件。

 “实时编码”教学法。对于大多数新概念,都通过完整的、可实际运行的C++程序进行介绍,程序后附有一个或多个执行样例,用于展示程序的输入/输出。

 对C++基础知识的详尽介绍。第2章为读者提供了友好的C++编程入门介绍。第4章和第5章阐述了控制语句和算法开发的相关内容。

 语法着色。为了提高代码的可读性,对所有C++代码进行了语法着色处理,着色约定如下: 

注释: 

关键字: 

常量和字面值: 

普通代码: 

 代码高亮。对每个程序的新功能添加阴影进行标注。

 利用字体进行强调。为便于查阅,用粗体突出显示每个关键词的定义; 用加粗的Helvetica字体强调屏幕组件(如File菜单); 用Lucida字体表示C++程序文本(如int x = 5;)。

 学习目标。明确说明每章的学习目标。

 编程提示。我们提供了多种图标以帮助你将重点放在程序开发的关键部分。这些技巧提示和实践经验是我们多年来教学和行业经验的总结。

良好的编程实践

提示你关注那些能够帮助你编写出更清晰、更易理解及更易维护的程序的技术。

常见的编程错误

指出这些常见的编程错误可以减少出现类似错误的可能性。

错误预防技巧

包含发现和清除程序错误的建议,其中许多技巧介绍了如何在开始编写C++程序时第一时间防止错误产生。

性能优化技巧

主要帮助你提高程序运行速度或最大限度地减少程序内存占用。

可移植性技巧

帮助你编写能够在多种平台上运行的代码。

软件工程观察

突显了影响软件系统(尤其是大型系统)构建的结构和设计问题。

 总结要点。每章章末都以清单的形式列出该章要点。每个关键词均用粗体标出,并附有该关键词首次定义的页码。

 索引。为方便查阅,我们编写了详尽的索引,其中关键词首次出现的位置以加粗页码的形式突出显示。

安全的C++编程

构建能够抵御病毒、蠕虫及其他“恶意软件”攻击的工业级强度的系统是非常困难的。在当今互联网环境下,这类攻击能够瞬间爆发并波及全球。因此,在软件开发周期之初就融入安全措施,可以显著降低系统安全风险。

CERT(the Computer Emergency Response Team,计算机应急响应小组)(www.cert.org)的成立旨在迅速分析并应对各类安全攻击。CERT是一个卡内基梅隆大学软件工程研究所内的政府资助的机构。CERT发布并推广针对多种主流编程语言的安全编码标准,以帮助软件开发人员实现工业级强度的系统,避免那些可能导致系统易受攻击的编程实践。

我们衷心感谢卡内基梅隆大学计算机科学学院的兼职教授、CERT前安全编码主管Robert C. Seacord先生。Seacord先生曾作为C how to program,7th Edition的技术审稿人,从安全角度对书中的C程序进行了严格审查,并建议我们遵循CERT C Secure Coding Standard的核心准则。

在撰写本书时,我们也严格遵循CERT C++ Secure Coding Standard,该标准可以通过http://www.securecoding.cert.org查阅。

很高兴自20世纪90年代初以来,我们的书中已经推荐了许多这样的编码实践。根据这些标准,我们升级了书中的代码和讨论内容,使本书更适合作为入门或中级教材。如果你将要构建工业级的C++系统,请参阅Seacord先生所著的Secure Coding in C and C++,Second Edition(AddisonWesley Professional,2013)一书。

教师辅助资料

以下辅助资料仅面向符合条件的教师,可以扫描下方二维码申请: 

 解答手册。它包含了大部分练习题的解答,但对于“项目”性质的练习题,我们没有提供解答。

 多项选择题的测试文件。

 可定制的PowerPoint幻灯片。涵盖了书中所有代码和图表,还包括了书中各个要点的摘要。

辅助资料申请

致谢

我们要感谢Deitel & Associates公司的Barbara Deitel,她为本项目投入了大量时间。她不辞辛劳地研究了C++11和C++14的新功能。

我们深感荣幸能与Pearson Higher Education的专业出版团队合作。特别感谢Computer Science执行主编Tracy Johnson的指导,感谢Kristy Alaura为组织审阅团队和管理审稿流程所做的工作,感谢Bob Engelhardt为本书出版所做的工作。

感谢Deitel & Associates公司前总裁Abbey Deitel,她毕业于卡内基梅隆大学Tepper管理学院并获得工业管理学士学位。Abbey曾管理Deitel & Associates公司的业务长达17年。在此期间,她参与撰写了多本著作,其中包括本书前几个版本的第1章。

衷心感谢本书的各位审阅专家的辛勤付出。本书的十版更迭历经教授C++课程的学者、C++标准委员会现任及前任委员,以及使用C++构建工业级高性能系统的行业专家的仔细审阅,他们为本书的完善提供了无数宝贵的建议。如果书中仍存在不足之处,那是我们自身的责任。

如果广大读者能够在阅读的同时对本书的改进提出宝贵的评论、批评和建议,我们也真诚地表示感谢。希望大家能在阅读本书的过程中获得乐趣,就像我们在编写这本书时一样。

Paul Deitel

Harvey Deitel