内 容 简 介
本书是深受师生欢迎的优秀C++入门教材。作者结合自己多年的教学经验精心设计并编撰了本书内容。采用了很多便于巩固所学知识的设计,例如各章开头的小节总览,书中随处可见的小结框、编程提示和编程陷阱,各章结尾的小结、习题、编程练习和编程项目等。这些非常适合初学者掌握重要的编程概念。
全书共18章,8个附录。在讲解C++基础知识之后,直接引导学生深入函数、I/O流、类、控制流程、命名空间、数组、字符串、指针和动态数组、递归、模板、指针和链表、派生类、异常以及标准模板库。
前 言
本书适合C++程序设计和计算机科学入门课程使用。阅读本书不要求读者有任何编程经验,也不要求掌握除了中学代数之外的其他任何数学知识。
本书前几版的读者请阅读关于第9版修订内容的小节,前言的其余内容可略过。新读者请阅读前言的全部内容以把握本书脉络。
第9版修订内容
第9版采用和第8版相同的编程体例。保留第8版全部内容,但进行以下修订。
* 章末的编程作业现在划分为“编程练习”和“编程项目”。编程练习帮助巩固本章的知识点,程序一般都很小,适合课堂练习。编程项目则要求综合运用多方面的知识来解决问题,程序一般比编程练习大,适合作为家庭作业。
* 在C++98的背景下介绍C++11,涉及的主题包括新整型、auto类型、原始字符串字面值、强枚举、nullptr、以范围为基础的for循环、字符串和整数相互转换、成员初始化列表和委托构造函数等。
* 提供了关于排序、安全编程(即溢出和数组越界)以及继承的补充材料。
* 勘误。
* 新增21个编程练习和10个编程项目。
* 本书配套网站新增10个视频讲解,使总数达到64个。这些视频讲解辅导学生解题和写程序,有助于巩固对关键编程概念的掌握。如果书中某个主题有对应的视频讲解,就会出现一个特殊的图标。
用过第8版的教师可沿用以前的教案,几乎不需要任何改动。
主题可以灵活排序
本书允许教师自由安排教学顺序。为了演示这一灵活性,下面推荐了两种顺序。采用任何顺序都不会影响学习的连贯性。为了在改变顺序时确保这种连贯性,可能需要移动个别小节而不是全章。但是,只有较大的、位置便利的小节才需要移动。为了帮助您根据需要自定义一个教学/阅读顺序,图P.1展示了一幅依赖图。另外,每章都有“预备知识”小节,解释了学习那一章的每一节之前需掌握的内容。
重新排序1:提前学习类
为了有效地设计类,学生需要掌握一些基本的工具,比如控制结构和函数定义。这些基础知识在第1章~第6章介绍。完成第6章的学习后,学生就可以开始写自己的类了。如果想提前学习类的知识,可以像下面这样重新安排各章的顺序。
* 基础知识 第1章、第2章、第3章、第4章、第5章和第6章。这6章全面介绍控制结构、函数定义和基本文件I/O。第3章介绍几种额外的控制结构,如果希望尽早学习类,可以考虑推迟这一章的学习。
* 类和命名空间 第10章、第11章的11.1节和11.2节、第12章。这些章节全面介绍了如何定义类、友元、重载操作符和命名空间。
* 数组、字符串和向量 第7章和第8章。
* 指针和动态数组 第9章。
* 类类型的数组和数组作为类成员 第11章的11.3节和11.4节。
* 继承 第15章。
* 递归 第14章(也可以推迟到更晚的时候学习)。
* 指针和链表 第13章。
可能还要用到以下各章的部分内容。
* 异常处理 第16章。
* 模板 第17章。
* 标准模板库 第18章。
重新排序2:略微推迟类的学习
在“重新排序2”中,将先学完所有控制结构,再学习数组的基本知识,之后才开始学习类。虽然对类的接触要比“重新排序1”晚,但还是比本书的默认顺序略微提前一些。
* 基础知识 第1章、第2章、第3章、第4章、第5章和第6章。这6章全面介绍了控制结构、函数定义和基本文件I/O。
* 数组和字符串 第7章、第8章的8.1节和8.2节。
* 类和命名空间 第10章、第11章的11.1节、11.2节和第12章。这些章节全面介绍了如何定义类、友元、重载操作符和命名空间。
* 指针和动态数组 第9章。
* 类类型的数组和数组作为类成员 第11章的11.3节和11.4节。
* 继承 第15章。
* 递归 第14章(也可以推迟到更晚的时候学习)。
* 向量 8.3节。
* 指针和链表 第13章。
可能还要用到以下各章的部分内容。
* 异常处理 第16章。
* 模板 第17章。
* 标准模板库 第18章。
依赖图
如下所示的依赖图展示了各个章节可能的排序方式。连接两个框的实线表明上部的框必须先于下部的框完成。只要符合这个条件,采用任何阅读顺序都无损连贯性。如果一个框中包含小节编号,表明该框只代表那些小节,不代表全章。
面向学生的易用性
一本书必须按恰当的顺序来讲解恰当的主题,这是最起码的要求。另外,在老师和其他有经验的程序员看来,书的内容必须清晰而正确,这是另一个最起码的要求。但是不是符合这两项要求的书都是好书呢?答案是否定的。书中的内容必须采取有利于初学者使用的方式来编排。在这本入门教科书中,我尽力让学生觉得清楚和友好。本书以前版本的大量学生反馈证明,这种写作风格确实使内容更清晰,能使学生充分享受到学习的乐趣。
ANSI/ISO C++标准
本书完全兼容符合最新ANSI/ISO C++标准的编译器。写作时的最新标准是C++ 11。
高级主题
许多“高级主题”都已成为标准CS1课程的一部分。即使不是,以补充材料的形式提供也不错。本书提供大量高级主题,它们既可集成到课程中,也可作为自学主题。本书全面讲述了C++模板、继承(包括虚函数)、异常处理和STL(Standard Template Library,标准模板库)。虽然本书使用了库,而且教给学生库的重要性,但不要求任何非标准库。本书只使用所有C++实现都有的库。
小结框
每个要点都用一个有底纹的方框来小结,它们散布于各章。
自测题
每章都在重要位置提供大量自测题。答案在章末提供。
视频讲解
视频讲解(Video Note)旨在讲解关键编程概念和技术,演示了从设计到编码来解决问题的过程。视频讲解使学生能方便地自学感兴趣的主题,支持选择、播放、倒退、快进和暂停。每当看到“ 视频讲解”,都表明当前主题有对应的视频讲解。注意,由于是英文视频,所以为了方便索引,书中保留了这些视频的英文名称。
支持材料
有一部分支持材料适用于本书所有读者。其他仅适用于有资格的教师。
适用于本书所有读者的支持材料
* 源代码
* PowerPoint幻灯片
* 视频讲解
适用于有资格的教师的资源
* 教师资源指南(Instructor’s Resource Guide):包括每一章的教学要点、课堂测验/答案和大量编程项目的参考答案。
* Test Bank和Test Generator:用于生成试卷。
* PowerPoint幻灯片:包括本书的程序和插图。
* Lab Manual(实验手册)。
目 录
第1章 计算机和C++编程入门 1
概述 2
1.1 计算机系统 2
硬件 2
软件 5
高级语言 6
编译器 7
1.2 编程和问题求解 9
算法 9
程序设计 10
面向对象编程 12
软件生命周期 12
1.3 C++入门 13
C++语言的起源 13
一个C++示范程序 14
简单C++程序的布局 17
编译和运行C++程序 19
1.4 测试和调试 21
程序错误的分类 22
小结 24
自测题答案 24
编程练习 25
编程项目 26
第2章 C++基础知识 29
概述 30
预备知识 30
2.1 变量和赋值 30
变量 30
名称:标识符 32
变量声明 33
赋值语句 34
2.2 输入和输出 37
使用cout进行输出 37
include预编译指令和命名空间 38
转义序列 39
格式化带小数点的数字 41
用cin进行输入 42
设计输入和输出 43
2.3 数据类型和表达式 44
int类型和double类型 44
其他数值类型 45
C++11类型 46
char类型 47
bool类型 48
string类简介 48
类型的兼容性 49
算术操作符和表达式 51
更多赋值语句 54
2.4 简单控制流程 54
一个简单的分支机制 54
复合语句 59
简单的循环机制 61
递增操作符和递减操作符 63
2.5 程序风格 66
缩进 67
注释 67
为常量命名 68
小结 71
自测题答案 71
编程练习 74
编程项目 76
第3章 更多的控制流程 79
概述 80
预备知识 80
3.1 使用布尔表达式 80
布尔表达式求值 80
枚举类型(选读) 85
3.2 多 路 分 支 86
嵌套语句 86
多路if-else语句 88
switch语句 92
为菜单使用switch语句 95
语句块 96
3.3 C++循环语句详解 99
while语句回顾 99
再论递增操作符和递减操作符 100
for语句 102
应该使用哪种循环 106
break语句 108
3.4 设计循环 109
求和与求乘积的循环 109
终止循环 111
嵌套循环 113
调试循环 114
小结 117
自测题答案 117
编程练习 121
编程项目 122
第4章 过程抽象和返回值的函数 125
概述 126
预备知识 126
4.1 自顶向下设计 126
4.2 预定义函数 126
使用预定义函数 127
随机数生成 130
强制类型转换 131
强制类型转换的古老形式 133
4.3 程序员自定义函数 134
函数定义 134
返回布尔值的函数 138
另一种形式的函数声明 138
函数定义语法小结 140
再论函数定义的位置 140
4.4 过程抽象 142
黑盒的比喻 142
4.5 作用域和局部变量 151
函数如同小程序 151
全局常量和全局变量 153
传值形参是局部变量 155
块作用域 156
再论命名空间 157
4.6 重载函数名称 160
重载入门 160
自动类型转换 164
小结 166
自测题答案 166
编程练习 169
编程项目 170
第5章 所有子任务的函数 173
概述 174
预备知识 174
5.1 void函数 174
void函数的定义 174
void函数中的return语句 177
5.2 传引用参数 178
初探传引用调用 179
传引用调用详解 180
混合的参数列表 185
5.3 使用过程抽象 188
在函数中调用其他函数 188
前条件和后条件 189
5.4 测试和调试函数 194
存根和驱动程序 194
5.5 常规调试技术 197
兼容并蓄,不抱偏见 198
检查常见错误 198
定位错误 198
assert宏 200
小结 202
自测题答案 202
编程练习 205
编程项目 206
第6章 I/O流:对象和类入门 209
概述 210
预备知识 210
6.1 流和基本文件I/O 210
文件之于I/O的重要性 211
文件I/O 211
类与对象入门 214
文件I/O技术 218
追加到文件(选读) 220
文件名作为输入(选读) 221
6.2 流I/O工具 224
用流函数格式化输出 224
操纵元 227
流作为函数实参 228
命名空间的问题 231
6.3 字符I/O 233
成员函数get和put 233
putback成员函数(选读) 236
函数的默认实参(选读) 240
eof成员函数 243
预定义字符函数 246
小结 249
自测题答案 249
编程练习 254
编程项目 254
第7章 数组 259
概述 260
预备知识 260
7.1 数组入门 260
声明和引用数组 260
数组在内存中的表示 263
初始化数组 265
7.2 函数中的数组 267
索引变量作为函数参数 267
整个数组作为函数参数 269
const参数修饰符 271
返回数组的函数 273
7.3 数组编程 282
部分填充数组 282
7.4 多维数组 292
多维数组基础 292
多维数组参数 293
小结 298
自测题答案 298
编程练习 301
编程项目 302
第8章 字符串和向量 309
概述 310
预备知识 310
8.1 字符串的数组类型 310
C字符串值和C字符串变量 311
<cstring>中的其他函数 315
C字符串输入和输出 318
C字符串到数值的转换和可靠输入 320
8.2 标准string类 324
标准类string简介 324
string类的I/O 326
用string类进行字符串处理 330
string对象和C字符串之间的
转换 335
字符串和数字之间的转换 336
8.3 向量 336
向量基础知识 336
效率问题 339
小结 341
自测题答案 341
编程练习 343
编程项目 343
第9章 指针和动态数组 349
概述 350
预备知识 350
9.1 指针 350
指针变量 351
基本内存管理 356
静态变量和自动变量 356
9.2 动态数组 359
数组变量和指针变量 359
创建和使用动态数组 361
指针运算(选读) 364
多维动态数组(选读) 365
小结 367
自测题答案 367
编程练习 368
编程项目 368
第10章 定义类 373
概述 374
预备知识 374
10.1 结构 374
用于异种数据的结构 374
结构作为函数参数 378
对结构进行初始化 380
10.2 类 382
定义类和成员函数 382
公共成员和私有成员 386
总结类的一些特征 396
用于初始化的构造函数 397
10.3 抽象数据类型 405
用于生成抽象数据类型的类 405
10.4 继承 411
派生类 412
定义派生类 413
小结 416
自测题答案 416
编程练习 420
编程项目 420
第11章 类中的友元函数、重载
操作符和数组 425
概述 426
预备知识 426
11.1 友元函数 426
友元函数 428
实现digit_to_int(选读) 435
const参数修饰符 437
11.2 重载操作符 441
重载操作符 442
用于自动类型转换的构造函数 444
重载一元操作符 445
重载>>和<< 446
11.3 数组和类 452
类数组 452
数组作为类成员 455
11.4 类和动态数组 458
析构函数 460
拷贝构造函数 463
重载赋值操作符 467
小结 470
自测题答案 470
编程练习 476
编程项目 477
第12章 独立编译和命名空间 483
概述 484
预备知识 484
12.1 独立编译 484
ADT回顾 484
使用#ifndef 492
12.2 命名空间 495
命名空间和using预编译指令 495
创建命名空间 496
限定名称 498
命名空间的微妙之处(选读) 499
无名命名空间 500
小结 505
自测题答案 505
编程练习 506
编程项目 508
第13章 指针和链表 509
概述 510
预备知识 510
13.1 节点和链表 510
节点 511
nullptr 513
链表 514
在表头插入节点 515
搜索链表 518
指针作为迭代器 520
在列表中插入和删除节点 521
链表的变体 524
类构成的链表 526
13.2 栈和队列 528
栈 528
队列 532
小结 536
自测题答案 536
编程练习 538
编程项目 538
第14章 递归 545
概述 546
预备知识 546
14.1 面向任务的递归函数 546
深入递归 552
用于递归的栈 554
递归与迭代 555
14.2 面向值的递归函数 556
要返回值的递归函数的常规形式 556
14.3 递归思想 560
递归设计技术 560
小结 570
自测题答案 570
编程练习 573
编程项目 573
第15章 继承 577
概述 578
预备知识 578
15.1 继承基础 578
派生类 580
派生类中的构造函数 585
protected限定符 588
重定义成员函数 590
重定义与重载的比较 592
访问重定义的基函数 593
15.2 继承细节 594
不继承的函数 594
派生类中的赋值操作符和拷贝
构造函数 595
派生类中的析构函数 595
15.3 多态性 596
晚期绑定 597
C++虚函数 597
虚函数和扩展类型兼容性 601
小结 607
自测题答案 607
编程练习 610
编程项目 612
第16章 异常处理 617
概述 618
预备知识 618
16.1 异常处理基础 618
异常处理的简单例子 619
定义自己的异常类 625
多个throw块和catch块 626
在函数中抛出异常