\r\n \r\n “我几乎看过所有已经出版的C++图书,发现只有这本尤其适合大一学生。它很容易理解,既不过分纠缠于细节,也不遗漏任何关键概念。” ——Alan Evans,美国蒙哥马利市社区学院计算机科学系主任 \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n“许多作者在为大一学生编写教材时,都使用了过于复杂的例子。Walter Savitch知道如何用范例来有效地阐述一个概念。我喜欢这本书!” ——Anne Marchant博士,美国乔治梅森大学 \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n本书特色: \r\n\r\n\r\n ·根据最新的ANSI/IOS C++标准进行了全面修订 \r\n\r\n\r\n ·完全通过课程试验,具有很高的正确性和可靠性 \r\n\r\n\r\n·编排体系灵活,教师或学生可根据具体需要调整授课(或阅读)顺序 \r\n\r\n\r\n·适当添加高级主题(以'选读'形式出现),满足部分学生深入学习C++的需要\r\n\r\n\r\n·针对重要概念(或要点),在相应位置提供总结框(以添加灰色底纹的形式),以便学生巩固所学知识。\r\n\r\n\r\n·大量自测题穿插于相应小节,并在各章末尾提供自测题答案\r\n\r\n\r\n·各章末尾提供富有一定挑战性、但又妙趣横生的编程项目 \r\n\r\n\r\n 本书是最优秀的C++教材之一。自1995年以来,作者结合自己多年的教学经验,根据教学大纲精心设计并编写了书中内容。本书乃第4版,完全根据最新的ANSI/ISO \r\n\r\nC++标准对第3版进行了全面的修订,并结合广大教师和读者的优秀建议适当调整和增补了部分内容。考虑到大一学生刚涉足编程,作者还以粗体显示了C++的重要元素,并突出显示了重要的编程概念,同时在各章相应的小节提供自测题,在各章末尾提供小结和有趣而富有挑战性的编程项目。 \r\n\r\n\r\n\r\n\r\n 全书共17章,9个附录。在讲解了C++基础知识之后,循序渐进引导学生深入函数、I/O流、类、控制流程、命名空间、数组、字符串、指针和动态数组、递归、模板、指针和链表、派生类以及异常。 \r\n\r\n\r\n\r\n
\r\n
第1章 计算机和C++编程入门 \r\n\r\n 概述 \r\n\r\n 1.1 计算机系统 \r\n\r\n 1.1.1 硬件 \r\n\r\n 1.1.2 软件 \r\n\r\n 1.1.3 高级语言 \r\n\r\n 1.1.4 编译器 \r\n\r\n 自测题 \r\n\r\n 1.1.5 历史回顾 \r\n\r\n 1.2 编程和问题求解 \r\n\r\n 1.2.1 算法 \r\n\r\n 1.2.2 程序设计 \r\n\r\n 1.2.3 面向对象编程 \r\n\r\n 1.2.4 软件生存期 \r\n\r\n 1.3 C++入门 \r\n\r\n 1.3.1 C++语言的起源 \r\n\r\n 1.3.2 一个C++示范程序 \r\n\r\n 1.3.3 陷阱:在\n中使用错误的斜杠 \r\n\r\n 1.3.4 编程提示:输入和输出语法 \r\n\r\n 1.3.5 简单C程序的布局 \r\n\r\n 1.3.6 陷阱:在include文件名前添加一个空格 \r\n\r\n 1.3.7 编译和运行C++程序 \r\n\r\n 1.3.8 编程提示:让程序运行起来 \r\n\r\n 自测题 \r\n\r\n 1.4 测试和调试 \r\n\r\n 1.4.1 程序错误的种类 \r\n\r\n 1.4.2 陷阱:错误地假定程序正确 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第2章 C++基础知识 \r\n\r\n \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 2.1 变量和赋值 \r\n\r\n 2.1.1 变量 \r\n\r\n 2.1.2 名称:标识符 \r\n\r\n 2.1.3 变量声明 \r\n\r\n 2.1.4 赋值语句 \r\n\r\n 2.1.5 陷阱:未初始化的变量 \r\n\r\n 2.1.6 编程提示:使用有意义的名称 \r\n\r\n 自测题 \r\n\r\n 2.2 输入和输出 \r\n\r\n 2.2.1 使用cout进行输出 \r\n\r\n 2.2.2 include预编译指令和命名空间 \r\n\r\n 2.2.3 转义序列 \r\n\r\n 2.2.4 编程提示:用\n或endl终止每一个程序 \r\n\r\n 2.2.5 格式化带小数点的数字 \r\n\r\n 2.2.6 用cin进行输入 \r\n\r\n 2.2.7 设计输入和输出 \r\n\r\n 2.2.8 编程提示:I/O中的行中断 \r\n\r\n 自测题 \r\n\r\n 2.3 数据类型和表达式 \r\n\r\n 2.3.1 int类型和double类型 \r\n\r\n 2.3.2 其他数字类型 \r\n\r\n 2.3.3 char类型 \r\n\r\n 2.3.4 bool类型 \r\n\r\n 2.3.5 类型的兼容性 \r\n\r\n 2.3.6 算术操作符和表达式 \r\n\r\n 2.3.7 陷阱:除法中的整数 \r\n\r\n 自测题 \r\n\r\n 2.3.8 更多赋值语句 \r\n\r\n 2.4 简单控制流程 \r\n\r\n 2.4.1 一个简单的分支机制 \r\n\r\n 2.4.2 陷阱:连续的不等式 \r\n\r\n 2.4.3 陷阱:错用=来取代== \r\n\r\n 2.4.4 复合语句 \r\n\r\n 自测题 \r\n\r\n 2.4.5 简单的循环机制 \r\n\r\n 2.4.6 递增操作符和递减操作符 \r\n\r\n 2.4.7 编程示例:信用卡余额 \r\n\r\n 2.4.8 陷阱:无限循环 \r\n\r\n 自测题 \r\n\r\n 2.5 程序风格 \r\n\r\n 2.5.1 缩进 \r\n\r\n 2.5.2 注释 \r\n\r\n 2.5.3 为常量命名 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第3章 过程抽象和返回一个值的函数 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 3.1 自顶向下设计 \r\n\r\n 3.2 预定义函数 \r\n\r\n 3.2.1 使用预定义函数 \r\n\r\n 3.2.2 强制类型转换 \r\n\r\n 3.2.3 强制类型转换的古老形式 \r\n\r\n 3.2.4 陷阱:整数除法丢弃了小数部分 \r\n\r\n 自测题 \r\n\r\n 3.3 程序员自定义函数 \r\n\r\n 3.3.1 函数定义 \r\n\r\n 3.3.2 另一种形式的函数声明 \r\n\r\n 3.3.3 陷阱:实参顺序错误 \r\n\r\n 3.3.4 函数定义语法总结 \r\n\r\n 3.3.5 再论函数定义的位置 \r\n\r\n 自测题 \r\n\r\n 3.4 过程抽象 \r\n\r\n 3.4.1 黑盒的比喻 \r\n\r\n 3.4.2 编程提示:选择形参名称 \r\n\r\n 3.4.3 案例分析:购买比萨 \r\n\r\n 3.4.4 编程提示:使用伪代码 \r\n\r\n 自测题 \r\n\r\n 3.5 局部变量 \r\n\r\n 3.5.1 函数如同小程序 \r\n\r\n 3.5.2 编程实例:豌豆试验田 \r\n\r\n 3.5.3 全局常量和全局变量 \r\n\r\n 3.5.4 传值调用形参是局部变量 \r\n\r\n 3.5.5 再论命名空间 \r\n\r\n 自测题 \r\n\r\n 3.5.6 编程实例:阶乘函数 \r\n\r\n 3.6 重载函数名称 \r\n\r\n 3.6.1 重载入门 \r\n\r\n 3.6.2 编程实例:购买比萨(修订版) \r\n\r\n 3.6.3 自动类型转换 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第4章 所有子任务的函数 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 4.1 void函数 \r\n\r\n 4.1.1 void函数的定义 \r\n\r\n 4.1.2 编程实例:温度换算 \r\n\r\n 4.1.3 void函数中的return语句 \r\n\r\n 自测题 \r\n\r\n 4.2 传引用调用形参 \r\n\r\n 4.2.1 初探传引用调用 \r\n\r\n 4.2.2 传引用调用详解 \r\n\r\n 4.2.3 编程实例:swap_values函数 \r\n\r\n 4.2.4 混合的参数列表 \r\n\r\n 4.2.5 编程提示:应该使用哪种参数 \r\n\r\n 4.2.6 陷阱:疏忽的局部变量 \r\n\r\n 自测题 \r\n\r\n 4.3 使用过程抽象 \r\n\r\n 4.3.1 由函数来调用函数 \r\n\r\n 4.3.2 前条件和后条件 \r\n\r\n 4.3.3 案例分析:超市定价系统 \r\n\r\n 自测题 \r\n\r\n 4.4 测试和调试函数 \r\n\r\n Stub和驱动程序 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第5章 I/O流——对象和类入门 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 5.1 流和基本文件I/O \r\n\r\n 5.1.1 文件之于I/O的重要性 \r\n\r\n 5.1.2 文件I/O \r\n\r\n 5.1.3 类与对象入门 \r\n\r\n 5.1.4 编程提示:检查文件是否成功打开 \r\n\r\n 5.1.5 文件I/O技术 \r\n\r\n 自测题 \r\n\r\n 5.1.6 追加到文件(选读) \r\n\r\n 5.1.7 文件名作为输入(选读) \r\n\r\n 5.2 流I/O工具 \r\n\r\n 5.2.1 用流函数格式化输出 \r\n\r\n 5.2.2 操纵元 \r\n\r\n 自测题 \r\n\r\n 5.2.3 流作为函数实参 \r\n\r\n 5.2.4 编程提示:检查文件尾 \r\n\r\n 5.2.5 命名空间的问题 \r\n\r\n 5.2.6 编程实例:整理文件格式 \r\n\r\n 自测题 \r\n\r\n 5.3 字符I/O \r\n\r\n 5.3.1 get和put成员函数 \r\n\r\n 5.3.2 putback成员函数(选读) \r\n\r\n 5.3.3 编程实例:检查输入 \r\n\r\n 5.3.4 陷阱:输入中不期而遇的“\n” \r\n\r\n 自测题 \r\n\r\n 5.3.5 eof成员函数 \r\n\r\n 自测题 \r\n\r\n 5.3.6 编程实例:编辑文本文件 \r\n\r\n 5.3.7 预定义的字符函数 \r\n\r\n 5.3.8 陷阱:toupper和tolower返回int值 \r\n\r\n 自测题 \r\n\r\n 5.4 继承 \r\n\r\n 5.4.1 流类之间的继承关系 \r\n\r\n 5.4.2 编程实例:另一个new_line函数 \r\n\r\n 5.4.3 函数的默认参数(选读) \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第6章 定义类 \r\n\r\n 概述 \r\n\r\n 预备结构 \r\n\r\n 6.1 结构 \r\n\r\n 6.1.1 用于异种数据的结构 \r\n\r\n 6.1.2 陷阱:结构定义中忘记一个分号 \r\n\r\n 6.1.3 结构作为函数参数 \r\n\r\n 6.1.4 编程提示:使用层次化结构 \r\n\r\n 6.1.5 对结构进行初始化 \r\n\r\n 自测题 \r\n\r\n 6.2 类 \r\n\r\n 6.2.1 定义类和成员函数 \r\n\r\n 自测题 \r\n\r\n 6.2.2 公共成员和私有成员 \r\n\r\n 6.2.3 编程提示:将所有成员变量变成私有 \r\n\r\n 6.2.4 编程提示:定义取值函数和赋值函数 \r\n\r\n 自测题 \r\n\r\n 6.2.5 编程提示:将赋值操作符用于对象 \r\n\r\n 6.2.6 编程实例:BankAccount类(版本1) \r\n\r\n 6.2.7 总结类的一些特征 \r\n\r\n 自测题 \r\n\r\n 6.2.8 用于初始化的构造函数 \r\n\r\n 6.2.9 编程提示:总是包括一个默认构造函数 \r\n\r\n 6.2.10 陷阱:无参数构造函数 \r\n\r\n 自测题 \r\n\r\n 6.3 抽象数据类型 \r\n\r\n 6.3.1 用于生成抽象数据类型的类 \r\n\r\n 6.3.2 编程实例:类的另一种实现 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第7章 更多的控制流程 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 7.1 使用布尔表达式 \r\n\r\n 7.1.1 布尔表达式求值 \r\n\r\n 7.1.2 陷阱:将布尔表达式转换成int值 \r\n\r\n 自测题 \r\n\r\n 7.1.3 能返回布尔值的函数 \r\n\r\n 自测题 \r\n\r\n 7.1.4 枚举类型(选读) \r\n\r\n 7.2 多路分支 \r\n\r\n 7.2.1 嵌套语句 \r\n\r\n 7.2.2 编程提示:在嵌套语句中使用花括号 \r\n\r\n 7.2.3 多路if-else语句 \r\n\r\n 7.2.4 编程实例:州税 \r\n\r\n 自测题 \r\n\r\n 7.2.5 switch语句 \r\n\r\n 7.2.6 陷阱:忘记在switch语句中添加break \r\n\r\n 7.2.7 为菜单使用switch语句 \r\n\r\n 7.2.8 编程提示:在分支语句中使用函数调用 \r\n\r\n 7.2.9 块 \r\n\r\n 7.2.10 陷阱:疏忽局部变量 \r\n\r\n 自测题 \r\n\r\n 7.3 C++循环语句详解 \r\n\r\n 7.3.1 while语句回顾 \r\n\r\n 7.3.2 再论递增操作符和递减操作符 \r\n\r\n 自测题 \r\n\r\n 7.3.3 for语句 \r\n\r\n 7.3.4 陷阱:for语句中多余的分号 \r\n\r\n 7.3.5 应该使用哪种循环 \r\n\r\n 自测题 \r\n\r\n 7.3.6 陷阱:未初始化的变量和无限循环 \r\n\r\n 7.3.7 break语句 \r\n\r\n 7.3.8 陷阱:嵌套循环中的break语句 \r\n\r\n 自测题 \r\n\r\n 7.4 设计循环 \r\n\r\n 7.4.1 求和与求乘积的循环 \r\n\r\n 7.4.2 终止循环 \r\n\r\n 7.4.3 嵌套循环 \r\n\r\n 自测题 \r\n\r\n 7.4.4 调试循环 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第8章 友元函数和重载操作符 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 8.1 友元函数 \r\n\r\n 8.1.1 编程实例:一个相等性函数 \r\n\r\n 自测题 \r\n\r\n 8.1.2 友元函数 \r\n\r\n 8.1.3 编程提示:定义取值函数和友元函数 \r\n\r\n 8.1.4 编程提示:同时使用成员函数和非成员函数 \r\n\r\n 8.1.5 编程实例:Money类(版本1) \r\n\r\n 8.1.6 实现digit_to_int(选读) \r\n\r\n 8.1.7 陷阱:数字常量中的前置零 \r\n\r\n 自测题 \r\n\r\n 8.1.8 const参数修饰符 \r\n\r\n 8.1.9 陷阱:不一致地使用const \r\n\r\n 自测题 \r\n\r\n 8.2 重载操作符 \r\n\r\n 8.2.1 重载操作符 \r\n\r\n 自测题 \r\n\r\n 8.2.2 用于自动类型转换的构造函数 \r\n\r\n 自测题 \r\n\r\n 8.2.3 重载一元操作符 \r\n\r\n 8.2.4 重载>>和<< \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第9章 独立编译和命名空间 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 9.1 独立编译 \r\n\r\n 9.1.1 ADT回顾 \r\n\r\n 9.1.2 案例分析:一个独立编译的类DigitalTime \r\n\r\n 9.1.3 使用#ifndef \r\n\r\n 9.1.4 编程提示:定义其他库 \r\n\r\n 自测题 \r\n\r\n 9.2 命名空间 \r\n\r\n 9.2.1 命名空间和using预编译指令 \r\n\r\n 9.2.2 创建命名空间 \r\n\r\n 自测题 \r\n\r\n 9.2.3 限定名称 \r\n\r\n 9.2.4 命名空间的微妙之处(选读) \r\n\r\n 自测题 \r\n\r\n 9.2.5 无名命名空间 \r\n\r\n 9.2.6 编程提示:为命名空间选择一个名称 \r\n\r\n 9.2.7 陷阱:混淆全局命名空间和无名命名空间 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第10章 数组 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 10.1 数组入门 \r\n\r\n 10.1.1 声明和引用数组 \r\n\r\n 10.1.2 编程提示:为数组使用for循环 \r\n\r\n 10.1.3 陷阱:数组索引总是从零开始 \r\n\r\n 10.1.4 编程提示:为数组长度使用一个已定义常量 \r\n\r\n 10.1.5 数组在内存中的表示 \r\n\r\n 10.1.6 陷阱:数组索引越界 \r\n\r\n 10.1.7 初始化数组 \r\n\r\n 自测题 \r\n\r\n 10.2 函数中的数组 \r\n\r\n 10.2.1 索引变量作为函数参数 \r\n\r\n 自测题 \r\n\r\n 10.2.2 整个数组作为函数参数 \r\n\r\n 10.2.3 const参数修饰符 \r\n\r\n 10.2.4 陷阱:不一致地使用const参数 \r\n\r\n 10.2.5 返回数组的函数 \r\n\r\n 10.2.6 案例分析:产量图 \r\n\r\n 自测题 \r\n\r\n 10.3 数组编程 \r\n\r\n 10.3.1 部分填充数组 \r\n\r\n 10.3.2 编程提示:不要吝啬形参 \r\n\r\n 10.3.3 编程实例:数组搜索 \r\n\r\n 10.3.4 编程实例:数组排序 \r\n\r\n 自测题 \r\n\r\n 10.4 数组和类 \r\n\r\n 10.4.1 类数组 \r\n\r\n 自测题 \r\n\r\n 10.4.2 数组作为类成员 \r\n\r\n 10.4.3 编程实例:用于部分填充数组的一个类 \r\n\r\n 自测题 \r\n\r\n 10.5 多维数组 \r\n\r\n 10.5.1 多维数组基础 \r\n\r\n 10.5.2 多维数组参数 \r\n\r\n 10.5.3 编程实例:二维打分程序 \r\n\r\n 10.5.4 陷阱:在数组索引之间使用逗号 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第11章 字符串和向量 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 11.1 字符串的一种数组类型 \r\n\r\n 11.1.1 C字符串值和C字符串变量 \r\n\r\n 11.1.2 陷阱:为C字符串使用=和== \r\n\r\n 11.1.3 中的其他函数 \r\n\r\n 自测题 \r\n\r\n 11.1.4 C字符串输入和输出 \r\n\r\n 自测题 \r\n\r\n 11.1.5 C字符串到数字的转换和可靠输入 \r\n\r\n 11.2 标准string类 \r\n\r\n 11.2.1 标准类string简介 \r\n\r\n 11.2.2 string类的I/O \r\n\r\n 自测题 \r\n\r\n 11.2.3 编程提示:getline的其他版本 \r\n\r\n 11.2.4 陷阱:混合使用“cin>>变量, ”和getline \r\n\r\n 11.2.5 用string类进行字符串处理 \r\n\r\n 11.2.6 编程实例:回文测试 \r\n\r\n 自测题 \r\n\r\n 11.2.7 string对象和C字符串之间的转换 \r\n\r\n 11.3 向量 \r\n\r\n 11.3.1 向量基础知识 \r\n\r\n 11.3.2 陷阱:使用方括号时超出向量长度 \r\n\r\n 11.3.3 编程提示:向量赋值具有良好行为 \r\n\r\n 11.3.4 效率问题 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第12章 指针和动态数组 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 12.1 指针 \r\n\r\n 12.1.1 指针变量 \r\n\r\n 自测题 \r\n\r\n 12.1.2 基本内存管理 \r\n\r\n 12.1.3 陷阱:虚悬指针 \r\n\r\n 12.1.4 静态变量和自动变量 \r\n\r\n 12.1.5 编程提示:定义指针类型 \r\n\r\n 自测题 \r\n\r\n 12.2 动态数组 \r\n\r\n 12.2.1 数组变量和指针变量 \r\n\r\n 12.2.2 创建和使用动态数组 \r\n\r\n 自测题 \r\n\r\n 12.2.3 指针运算(选读) \r\n\r\n 自测题 \r\n\r\n 12.2.4 多维动态数组(选读) \r\n\r\n 12.3 类和动态数组 \r\n\r\n 12.3.1 编程实例:一个字符串变量类 \r\n\r\n 12.3.2 析构函数 \r\n\r\n 12.3.3 陷阱:指针作为传值调用参数 \r\n\r\n 12.3.4 拷贝构造函数 \r\n\r\n 自测题 \r\n\r\n 12.3.5 重载赋值操作符 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第13章 递归 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 13.1 面向任务的递归函数 \r\n\r\n 13.1.1 案例分析:垂直数字 \r\n\r\n 13.1.2 深入递归 \r\n\r\n 13.1.3 陷阱:无穷递归 \r\n\r\n 自测题 \r\n\r\n 13.1.4 用于递归的堆栈 \r\n\r\n 13.1.5 陷阱:堆栈溢出 \r\n\r\n 13.1.6 递归与迭代 \r\n\r\n 自测题 \r\n\r\n 13.2 面向值的递归函数 \r\n\r\n 13.2.1 返回值的递归函数的泛型 \r\n\r\n 13.2.2 编程实例:另一个Powers函数 \r\n\r\n 自测题 \r\n\r\n 13.3 递归思想 \r\n\r\n 13.3.1 递归设计技术 \r\n\r\n 13.3.2 案例分析:二叉搜索(递归思想示例) \r\n\r\n 13.3.3 编程实例:一个递归成员函数 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第14章 模板 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 14.1 用于算法抽象的模板 \r\n\r\n 14.1.1 函数模板 \r\n\r\n 14.1.2 陷阱:编译器的复杂性 \r\n\r\n 自测题 \r\n\r\n 14.1.3 编程实例:一个泛化的排序函数 \r\n\r\n 14.1.4 编程提示:如何定义模板 \r\n\r\n 14.1.5 陷阱:为不恰当的类型使用模板 \r\n\r\n 自测题 \r\n\r\n 14.2 用于数据抽象的模板 \r\n\r\n 14.2.1 类模板的语法 \r\n\r\n 14.2.2 编程实例:一个数组类 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第15章 指针和链接 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 15.1 节点和链表 \r\n\r\n 15.1.1 节点 \r\n\r\n 自测题 \r\n\r\n 15.1.2 链表 \r\n\r\n 15.1.3 在表头插入一个节点 \r\n\r\n 15.1.4 陷阱:丢失节点 \r\n\r\n 15.1.5 搜索链表 \r\n\r\n 15.1.6 指针作为迭代器 \r\n\r\n 15.1.7 在列表中插入和移除节点 \r\n\r\n 15.1.8 陷阱:为动态数据结构使用赋值操作符 \r\n\r\n 自测题 \r\n\r\n 15.2 一个链表应用程序 \r\n\r\n 15.2.1 堆栈 \r\n\r\n 15.2.2 编程实例:一个堆栈类 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第16章 继承 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 16.1 继承基础 \r\n\r\n 16.1.1 派生类 \r\n\r\n 16.1.2 派生类中的构造函数 \r\n\r\n 16.1.3 陷阱:使用来自基类的私有成员变量 \r\n\r\n 16.1.4 陷阱:私有成员函数根本不会继承 \r\n\r\n 16.1.5 protected限定符 \r\n\r\n 自测题 \r\n\r\n 16.1.6 重定义成员函数 \r\n\r\n 16.1.7 重定义与重载的比较 \r\n\r\n 16.1.8 访问重定义的基函数 \r\n\r\n 自测题 \r\n\r\n 16.2 继承细节 \r\n\r\n 16.2.1 不继承的函数 \r\n\r\n 16.2.2 派生类中的赋值操作符和拷贝构造函数 \r\n\r\n 16.2.3 派生类中的析构函数 \r\n\r\n 自测题 \r\n\r\n 16.3 多态性 \r\n\r\n 16.3.1 晚期绑定 \r\n\r\n 16.3.2 C++中的虚函数 \r\n\r\n 自测题 \r\n\r\n 16.3.3 虚函数和扩展类型兼容性 \r\n\r\n 16.3.4 陷阱:切片问题 \r\n\r\n 16.3.5 陷阱:不使用虚成员函数 \r\n\r\n 16.3.6 陷阱:试图对虚成员函数定义不齐全的类进行编译 \r\n\r\n 16.3.7 编程提示:虚析构函数 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 第17章 异常处理 \r\n\r\n 概述 \r\n\r\n 预备知识 \r\n\r\n 17.1 异常处理基础 \r\n\r\n 17.1.1 异常处理的一个玩具式例子 \r\n\r\n 自测题 \r\n\r\n 17.1.2 定义自己的异常类 \r\n\r\n 17.1.3 多个throw和catch \r\n\r\n 17.1.4 陷阱:首先捕捉较具体的异常 \r\n\r\n 17.1.5 编程提示:异常类可能微不足道 \r\n\r\n 17.1.6 在函数中抛出异常 \r\n\r\n 17.1.7 异常规范 \r\n\r\n 17.1.8 陷阱:派生类中的异常规范 \r\n\r\n 自测题 \r\n\r\n 17.2 用于异常处理编程技术 \r\n\r\n 17.2.1 抛出异常的时机 \r\n\r\n 17.2.2 陷阱:未捕捉的异常 \r\n\r\n 17.2.3 陷阱:嵌套的try-catch块 \r\n\r\n 17.2.4 陷阱:滥用异常 \r\n\r\n 17.2.5 异常类层次结构 \r\n\r\n 17.2.6 测试可用内存 \r\n\r\n 17.2.7 重新抛出异常 \r\n\r\n 自测题 \r\n\r\n 小结 \r\n\r\n 自测题答案 \r\n\r\n 编程项目 \r\n\r\n 附录1 C++关键字 \r\n\r\n 附录2 操作符的优先级 \r\n\r\n 附录3 ASCII字符集 \r\n\r\n 附录4 部分库函数 \r\n\r\n 附录5 assert语句 \r\n\r\n 附录6 内联函数 \r\n\r\n 附录7 重载数据索引方括号 \r\n\r\n 附录8 this指针 \r\n\r\n 附录9 将操作符重载为成员操作符 \r\n
\r\n
写一本书很难, 翻译一本书更难, 翻好一本书更是难上加难. 一个好的译本, 倾注了译者很多心血, 不仅要仔细揣摩作者的意思, 还必须用通俗易懂的文字令读者能轻松阅读. 在这期间, 必须注意不能任意篡改作者的原意. 忠实于原著, 读译本如读原作, 此为"信", 文字通达, 令国人一目了然, 此为"达":提炼文字, 使之有文学价值, 此为"雅".
计算机科学著作, 由于毕竟不是文学作品, 所以即使是原作, 也很少有做到"雅"的. 人们之所以需要这方面的译本, 主要还是为了快速消化和吸收国外的最新技术和观点, 所以对于译本来说, 最重要的恐怕是"信"和"达". 只有做到"信", 才有可能进一步追求"达", 进而实现"雅".
《C++面向对象程序设计--基础. 数据结构与编程思想》(Problem Solving with C++, The Object Of Programming)从1995年首次出版以来, 已经培养了很大一批杰出的C++程序员, 她的读者遍布全球, 在世界各地都有很好的口碑. 早在两年前, 我在大学里任教的朋友就向我介绍过这本书, 说这本书是一本非常好的C++入门教材, 尤其适合打算接触C抖编程的初学者使用, 其编排体系和写作风格也非常适合用作教材, 所以特别希望能看到本书的简体中文版. 当时, 此书还只是第3版. 从网上获得的信息来看, 这的确是一本精心编写的优秀教材.
后来, 有一天得知本书第4版简体中文版已授权清华大学出版社出版, 当时非常高兴, 立即请命, 希望担纲此书的翻译. 在众多前来试译的人中, 我有幸入围. 在拿到样书, 并通读全书之后, 得出一个结论:这是笔者从事专业计算机图书翻译工作10年时间里, 最棒的一本C++入门书.
她之所以好, 是因为有三大特色. 第一, 她文风朴实, 循序渐进(对于一本面向C++初学者的书来说, 这是最起码的要求), 而不像某些作者的书, 思维跳跃得很厉害, 读起来很费劲. 翻译过程中, 我也尽量做到这一点. 无论原著还是译本, 宗旨都是循循善诱地引导一个对C++完全陌生的人在短时间里充分熟悉并掌握C++编程技术. 稍微翻阅几页正文, 你就能充分体会到这个特点.
第二, 本书完全符合标准. 本书的示范程序不仅完全符合最新的ANSI/ISO C++标准, 还遵循行业通行的编程风格, 这便于读者在学习本书之后, 能写出任何程序员都能理解. 任何编译器都能通过的程序.
第三, 这个特色体现在本书的组织和结构上. 时下流行的一个观点是, 学习C++应该先从类学起. 没问题, 本书在创作时便充分考虑到了这一部分读者的要求. 事实上, 你可以按照自己喜欢的任何顺序宋阅读各章的内容. 这方面的详情可参考前言所提供的"依赖图". 由于这是一本真正的教科书, 所以每章都提供了丰富的. 重点突出的. 非常有趣的自测题和编程项目.
翻译过程中, 为了确保正确性, 笔者亲自完成了其中所有的自测题和大部分编程项目. 除此之外, 还亲自运行了全书所有示范程序. 根据笔者的经验, 每本书都有这样或那样的错误, 有的书错误之多, 以至于最终还要出版数十页的勘误. 但对这本书的测试结果令人惊叹, 它的代码具有很高的正确率, 这是一些同类教科书无法媲美的. 与此同时, 为保证正确性, 笔者在翻译时除了参考网上公开的原书勘误, 还和原作者进行了积极而卓有成效的沟通, 对原著进行的所有改动都是经过授权的. 这一过程有效确保了本书简体中文版的代码质量, 使之达到了百分之百的正确率.
关于术语, 本书简体中文版采用了业内通行的. 国内程序员非常熟悉的词汇. 基于翻译的本质, 我的工作是让读者无障碍地阅读文档, 并积极地跟上作者的思路. 假如因为某个或者许多稀奇古怪的词而阻碍了阅读, 那就是翻译工作的失败, 这不是你我所希望见到的.
在此, 首先要感谢原作者WalterSavitch, 是他写出了这样一本极其出色的C++编程书籍. 同时还要感谢翻译过程中为我提供帮助的所有人士, 尤其要感谢我的文稿编辑文开棋, 是她以极大的耐心审阅了全书, 使其无论在质量还是版式上, 都上升到了一个新的台阶, 还要感谢尤晓东, 是他对内容及版式提出中肯了而有价值的意见, 并使之付梓出版.
周靖于北京
2003年10月21日, 大风
作者简介
(美)Walter Savitch是美国加州圣地亚哥大学教授, 计算机科学课程的主要设计者之一. 作为一名享有盛名巳受人尊敬的作者和教育专家, 他的授课和写作风格深受教师和学生欢迎. 他编写过多本非常畅销的计算机教材, 其中包括Problem Solving withC++:The Object of Programming,Third Edition 和Data Structures and Other Objects Using C++.second Edition.
译者简介
周靖毕业于北就理工大学. 在计算机行业“浸染”近20年.
本书供C++语言编程和计算机科学的入门课程使用. 它不要求读者具有编程经验, 而且除了高中代数之外, 不需要掌握其他数学知识.
如果你是本书前几版的读者, 请仔细阅读后文对第4版增补内容的说明, 然后可以完全略过前言的剩余部分. 如果你第一次接触本书, 请仔细阅读前言的剩余部分, 其中概述了本书的内容.
第4版增补
第4版采用的编程体系和第3版相同, 并采用相同的提纲. 对选用本书第3版作为教材的老师, 可以沿用以前的教案, 几乎不需要什么修改. 第4版的例子进行了更新, 添加了更多的习题, 另外新增了一些主题. 虽然第3版也完全兼容于新的ANSI/ISO标准, 但本版则根据标准进行了更全面的修订. 为了反映这一新趋势, 我们更新了术语, 例如用"函数声明"(Function Declaration)取代了"函数原型"(Function Prototype), 用"自由存储"(Freestore)取代了"堆"(Heap). 不过, 虽然本书进行了全面更新, 但主题的顺序和大多数例子只进行了微小改动.
本书第4版是授课老师在课程中增添新主题的好机会. 本版增补了向量(vector)的主题. 另外还进行了大量不是很明显的增补, 比如指针作为迭代器使用, 以及动态多维数组的问题等.
自己确定主题顺序
以C补为主题的大多数入门教材都有一个非常详细的进度表, 老师必须在上课时严格遵循. 但本书不准备这样做. 如果你是一名老师, 这本书能适应你的教学方式, 而不是要求你去适应这本书. 你可轻松地更改章节/顷序, 同时不会失去阅读本书时的连续性. 前言末尾的图P. 1为书中内容展示了一幅依赖图. 另外, 每一章都包含一个"预备知识"小节, 它解释了在学习那一章的内容之前, 必须先学习哪些章的内容. 这样一来, 老师就可以轻松地重新安排各个章节的授课顺序.
虽然本书使用了库, 并讲解了库的重要性, 但它不要求任何非标准库. 本书只使用几乎所有C++实现都提供了的库.
ANSI/ISOC++标准
本版进行了全面更新, 使用与新的ANSI/ISO C++标准相符的编译器. 由于没有任何理由再去使用与新标准不符的编译器, 所以本书不再深入讨论如何处理旧版编译器.
提前介绍类
本书允许灵活地讲授类. 学生可或早或晚地学习类的知识.
一本书至少可采取2种方式来讲述类:提前教学生如何设计他们自己的类, 或者只是提前教他们使用类, 而不去定义它们. 本书提前教学生定义自己的类, 而不只是提前教他们使用类. 为了有效地设计类, 学生需要一些基本工具, 比如一些简单的控制结构和函数定义. 所以, 本书将在第2章. 第3章和第4章开始讲解这些基础知识. 然后就快速转向类的主题. 第5章将用文件I/O流宋教学生使用类. 第6章将解释如何编写自己的类.
本书采用定量方式来传授类的知识. 它先教学生写一些非常简单的类, 然后添加构造函数, 再重载简单操作符, 再重载I/O操作符<<和>>, 依此类推. 这种定量教学方式避免了学生一开始就接触大量复杂的构造和概念. 但是, 本书的一个目标是让学生尽可能提前地编写现实的类定义, 而不是强迫他们花大量时间去编写一些故意简单化的类. 到第8章结束时, 学生就能写出完整和实用的类, 实现"类"的课程目标.
在课堂测验中, 我们发现学生如果提前接触类的知识, 他们的反应和提前接触函数时的反应是一样的. 这肯定会带来一些问题. 但是, 学生完全有能力或早或晚地学习这些知识. 此外, 通过提前学习类, 学生可对类有更好的理解. 对于自己掌握的第一种问题求解技术, 学生们往往具有很高的忠诚度. 所以, 作为老师, 如果你希望他们真正去使用一种技术, 就得提前教它. 另外, 类并不是学生们遇到的最困难的主题. 例如, 相较于普通(C风格)的数组, 类显得更直观, 行为也更易理解. 普通数组的问题将推迟到后文讲述.
虽然我们主张提前讲解类的知识, 但我们也知道并不是每个人都想提前讲解类. 所以, 本书也允许老师推迟讲解类的知识. 后面的"主题可以灵活排序"小节将具体讨论这个问题.
继承问题主要在第5章讲述, 使学生能提前接触这一概念. 但是, 本书要推迟到后文教学生写自己的派生类, 因为在一门初学课程刚开始的时候, 继承和派生类的重要性往往显示不出来. 第16章教学生如何定义和使用派生类, 其中包括使用虚函数. 有的老师选择在第二门课中再讲述这方面的主题, 另一些老师则可能想在入门课中讨论继承问题. 如果愿意, 有关继承的主题也可提前讲述.
面向学生的易用性
一本书仅按合适的顺序来讲解合适的主题是不够的. 除此之外, 一本书也不能只是做到清晰和正确, 让老师或其他有经验的程序员读起来满意. 素材必须采用一种初学者容易使用的方式来编排. 在这个系列的入门教材中, 我尽力让学生觉得清楚和友好. 根据使用本书以前版本的许多学生的反馈, 证明这种写作风格确实使素材更清晰, 而且通常都能为学生带来乐趣.
高级主题
许多"高级主题"都成为标准的CSI(计算机科学系一年级)课程的一部分. 即使它们不是课程的一部分, 也最好以补充材料的形式随书提供. 本书提供了大量高级主题, 它们既可集成到一门课程中, 也可作为自学主题. 我们全面讲述了C++模板. 继承(包括虚函数)和异常处理.
总结框
每个要点都用一个有底纹的方框来总结. 这些总结框散布于每一章.
自测题
每章都在相应的重要位置提供大量自测题. 每章末尾则给出所有自测题的完整答案.
课堂实测
世界各地的许多学生都用过本书的前3版. 许多学生以及他们的老师都提供了有益的反馈意见, 让我了解哪些适用于他们, 哪些则不适用. 大多数意见都积极地肯定了这本书, 表明大多数学生和老师都非常喜欢这本书. 当然, 还有一些建议要求我对本书进行修订. 所有修订意见都已经过仔细考虑. 正是基于这些宝贵的意见, 这一版才能逐渐成形, 最终摆上你的案头. 相较于以前各版, 这一版能更好地满足学生和老师的需要.
主题可以灵活排序
本书允许老师自由地重新安排教学材料. 为了展示这一灵活性, 我们推荐了多种方式来排列主题顺序. 采取推荐的任何一种方式来阅读本书, 都不失连贯性. 为了确保这种连贯性, 你可能需要移动节而不是整章. 但是, 只有处于方便位置的大节才需要移动. 为了帮助你根据需要来自定义一个阅读顺序, 图P. 1展示了一幅依赖图, 每一章都有一个"预备知识"小节, 它解释了在继续本章的学习之前, 事先需要阅读哪些章.
重新排序1:推迟学习类
第4版基本要求首先完成一门传统ANSIC课程的全部学习, 然后才学习类的知识. 在讲解类之前, 惟一和C++相似的就是流I/O的使用. 由于流I/O确实要求用到一些命名空间和类库, 所以在前几章里, 稍微讲解了怎样使用预定义命名空间和一些标准库I/0类.
● 基础知识:第1章. 第2章. 第3章. 第4章. 第5章和第7章(省略涉及到类定义的第6章). 这几章覆盖了所有控制结构. 函数定义以及基本文件I/O的知识.
● 数组:第10章, 省略涉及类的使用的10. 4节.
● C风格的字符串:第11章的11. 1节.
● 指针和动态数组:第12章, 省略和类有关的最后一节(12. 3节).
● 递归:第13章, 省略本章结尾的有关类的编程例子(另外, 也可将递归移动到课程后期讲述).
● 结构和类:第6章. 第8章和第11章的11. 2节.
● 独立编译和命名空间:第9章.
● 指针和链表:第15章.
也可使用以下章节的任意组合:
● 向量:第11章的11. 3节.
● 模板:第14章.
● 继承:第16章.
● 异常处理:第17章.
重新排序2:提前学习类
这个版本覆盖所有控制结构和有关数组的基本知识, 然后才开始讲解类. 只是讲解类
的时机要比上一种排序方式稍微提前.
● 基础知识:第1章. 第2章. 第3章. 第4章. 第5章和第7章(省略涉及到类定义的第6章). 这几章覆盖了所有控制结构. 函数定义以及基本文件I/O.
● 数组:第10章, 省略涉及类的使用的10. 4节.
● C风格的字符串:第11章的11. 1节.
● 结构和类:第6章. 第8章和第11章的11. 2节.
● 独立编译和命名空间:第9章.
● 指针和动态数组:第12章.
● 递归:第13章.
● 指针和链表:第15章.
也可使用以下章节的任意组合:
● 向量:第11章的11. 3节.
● 模板:第14章.
● 继承:第16章.
● 异常处理:第17章.
重新排序3:提前学习类, 但在此之前先掌握所有控制结构
这几乎是本书最标准的排序方式. 你只需将第7章放到第6章之前.
支持材料
原出版商在以下网站提供了以下支持材料:
http:www.aw.com/savitch/
● 示范程序:本书所有程序都可在上述网站找到.
● PowerPoint幻灯片:包括程序和本书插图.
另外, 也可到作者的网站下载程序:http://www-cse. ucsd. edu/users/savitch/以下材料只提供给通过认证的教师. 欲知详请, 请联系Addison-Wesley销售代表.
● 教参:每章都有教参, 包括丰富的教学提示. 课堂测验和答案以及许多编程项目的答案.
● TestBank:一个强大的试卷生成软件.
● LabManual(上机实验手册).
电子邮件联系
非常欢迎你的宝贵意见和建议, 这样能继续改进本书, 使之更符合你的需要. 所有意见和建议请发到:
wsavitch@ucsd. edu
我想知道你对这本书的任何看法, 并希望你提出修订建议. 但遗憾的是, 我不能为学生提供电子邮件咨询或者辅导服务, 否则我的电子邮件会堆积如山. 尤其是, 我不能为本书的习题或者你的老师布置的其他作业提供答案, 因为我没有足够的时间来解答所有这些问题. 另外, 我也不希望干扰任何老师的教学计划. 他们对于学生应该如何解决编程问题, 可能会有自己的一些安排. 如果你确实需要帮助, 那么至少值得安慰的是, 本书已经包括了所有自测题的答案. 另外在教参中, 还为教师提供了部分"编程项目"的答案, 但它们只提供给用本书来教学的老师, 不可泄露给学生.
依赖图
依赖图展示了各个章节可能的排序方式. 连接两个框的实线表明上部框中的内容必须先于下部框中的内容进行学习. 只要符合这个条件, 那么采用任何阅读顺序都不会损失连贯性. 如果一个框中包含小节编号, 表明该框只代表那些小节, 不代表全章.