本书是Deitel父子编写的全球最畅销的C++程序设计教材,全书详细介绍了过程式编程和面向对象编程的基本原理和方法,包括:控制结构、函数、数组、指针和字符串、类和抽象、运算符重载、继承、虚拟函数、多态性、I/O、模板、异常处理、文件处理、数据结构和标准模板库(STL)。本书注重理论与实践的结合,每章都以若干完整的示例程序讲述编程时应考虑的一些注意事项,包括:良好编程习惯、常见编程错误、性能提示、可移植性提示、软件工程知识以及测试和调试提示。通过一个贯穿全文的电梯模拟系统案例分析,重点突出了用UML进行面向对象系统分析与设计方法。此外,本版还增加了选学的“模式探索”部分。本书是高等院校进行程序设计和C++教学的教材,是软件设计人员进行C++程序开发的宝贵参考书。
第1章 计算机和C++编程概述\r\n\r\n1.1 简介\r\n1.2 计算机是什么\r\n1.3 计算机的构成\r\n1.4 操作系统的演进\r\n1.5 个人计算、分布式计算和客户机/服务器计算\r\n1.6 机器语言、汇编语言和高级语言\r\n1.7 C和C++发展简史\r\n1.8 C++标准库\r\n1.9 Java\r\n1.10 Visual Basic、Visual C++和C#\r\n1.11 其他高级语言\r\n1.12 结构化编程\r\n1.13 关键的软件趋势:对象技术\r\n1.14 一个典型的C++环境基础\r\n1.15 硬件发展趋势\r\n1.16 因特网发展简史\r\n1.17 万维网发展简史\r\n1.18 万维网协会(W3C)\r\n1.19 C++和本书的基本注意事项\r\n1.20 C++编程简述\r\n1.21 一个简单的程序:打印一行文字\r\n1.22 另一个简单程序:两个整数相加\r\n1.23 内存概念\r\n1.24 算术运算\r\n1.25 判断:相等运算符和关系运算符\r\n1.26 对象思想:对象技术及UML简介\r\n1.27 本书导读\r\n1.28 本章小结\r\n\r\n第2章 控制结构\r\n\r\n2.1 简介\r\n2.2 算法\r\n2.3 伪代码\r\n2.4 控制结构\r\n2.5 if选择结构\r\n2.6 if/else选择结构\r\n2.7 while循环结构\r\n2.8 算法设计:案例分析1(计数器控制循环)\r\n2.9 用自顶向下逐步求精法描述算法:案例分析2(标记控制的循环)\r\n2.10 用自顶向下逐步求精法描述算法:案例分析3(嵌套控制结构)\r\n2.11 赋值运算符\r\n2.12 自增和自减运算符\r\n2.13 计数器控制的循环的本质\r\n2.14 for循环结构\r\n2.15 for结构用法示例\r\n2.16 switch多选结构\r\n2.17 do/while循环结构\r\n2.18 break和continue语句\r\n2.19 逻辑运算符\r\n2.20 混淆相等运算等(==)和赋值运算符(=)\r\n2.21 结构化编程小结\r\n2.22 [可选案例分析]对象思想:确定问题所涉及的类\r\n2.23 本章小结\r\n\r\n第3章 函数\r\n\r\n3.1 简介\r\n3.2 C++程序组件\r\n3.3 数学库函数\r\n3.4 函数\r\n3.5 函数定义\r\n3.6 函数原型\r\n3.7 头文件\r\n3.8 随机数产生器\r\n3.9 示例:博彩游戏和enum简介\r\n3.10 存储类\r\n3.11 作用域规则\r\n3.12 递归\r\n3.13 递归应用示例:Fibonacci数列\r\n3.14 递归与迭代\r\n3.15 使用空参数列表的函数\r\n3.16 内联函数\r\n3.17 引用与引用参数\r\n3.18 默认实参\r\n3.19 一元作用域解析符\r\n3.20 函数重载\r\n3.21 函数模板\r\n3.22 [选学案例分析]对象思想:确定类的属性\r\n3.23 本章小结\r\n\r\n第4章 数组\r\n\r\n4.1 简介\r\n4.2 数组\r\n4.3 数组声明\r\n4.4 数组用法示例\r\n4.5 将数组传给函数\r\n4.6 数组排序\r\n4.7 案例研究:利用数组计算平均数、中位数和众数\r\n4.8 查找数组:线性查找和折半查找\r\n4.9 多下标数组\r\n4.10 [选学案例分析]对象思想:确定类的操作\r\n4.11 本章小结\r\n\r\n第5章 指针和字符串\r\n\r\n5.1 简介\r\n5.2 指针变量的声明和初始化\r\n5.3 指针运算符\r\n5.4 按引用调用函数\r\n5.5 使用带指针的const限定符\r\n5.6 用按引用传递实现的冒泡排序\r\n5.7 指针表达式和指针算法\r\n5.8 指针和数组的关系\r\n5.9 指针数组\r\n5.10 案例分析:洗牌和发牌模拟程序\r\n5.11 函数指针\r\n5.12 字符和字符串处理概述\r\n5.13 [选学案例分析]对象思想:对象间的交互\r\n5.14 小结\r\n\r\n第6章 类和数据抽象(一)\r\n\r\n6.1 简介\r\n6.2 结构定义\r\n6.3 访问结构成员\r\n6.4 用struct实现用户自定义类型Time\r\n6.5 用cllass实现Time抽象数据类型\r\n6.6 类作用域和访问类成员\r\n6.7 接口同实现方法的分离\r\n6.8 控制对成员的访问\r\n6.9 访问函数和工具函数\r\n6.10 初始化类对象:构造函数\r\n6.11 在构造函数中使用默认参数\r\n6.12 使用析构函数\r\n6.13 何时调用构造函数和析构函数\r\n6.14 使用设置函数和获取函数\r\n6.15 微妙的陷阱:返回对private数据成员的引用\r\n6.16 默认逐个成员赋值\r\n6.17 软件重用性\r\n6.18 [选学案例分析]对象思想:编写电梯模拟程序的类\r\n6.19 本章小结\r\n\r\n第7章 类和数据抽象(二)\r\n\r\n7.1 简介\r\n7.2 const对象和const成员函数\r\n7.3 合成:对象作为类成员\r\n7.4 友元函数和友元类\r\n7.5 使用this指针\r\n7.6 用new和delete实现动态内存分配\r\n7.7 静态类成员\r\n7.8 数据抽象与信息隐藏\r\n7.9 容器类和迭代器\r\n7.10 代理类\r\n7.11 [可选案例分析]对象思想:设计电梯模拟程序中的类\r\n7.12 本章小结\r\n\r\n第8章 运算符重载:字符串和数组对象\r\n\r\n8.1 简介\r\n8.2 运算符重载的基础知识\r\n8.3 运算符重载的限制条件\r\n8.4 用作类成员函数和友元函数的运算符函数\r\n8.5 重载流插入与流读取运算符\r\n8.6 重载一元运算符\r\n8.7 重载二元运算符\r\n8.8 案例分析:Array类\r\n8.9 类型转换\r\n8.10 案例分析:String类\r\n8.11 重载++和--\r\n8.12 案例分析:Date类\r\n8.13 标准库类string和vector\r\n8.14 本章小结\r\n\r\n第9章 面向对象程序设计:继承\r\n\r\n9.1 简介\r\n9.2 基类与派生类\r\n9.3 protected成员\r\n9.4 基类和派生类之间的关系\r\n9.5 案例分析:三级继承层次\r\n9.6 派生类中的构造函数和析构函数\r\n9.7 “uses a”和“knows a”关系\r\n9.8 public、protected和private继承\r\n9.9 关于继承的软件工程\r\n9.10 [可选案例分析]对象思想:在电梯模拟程序中结合继承\r\n9.11 本章小结\r\n\r\n第10章 面向对象程序设计:多态性\r\n\r\n10.1 概述\r\n10.2 继承层次中对象之间的关系\r\n10.3 多态性举例\r\n10.4 类型域和switch结构\r\n10.5 抽象类\r\n10.6 案例分析:继承接口和实现\r\n10.7 多态性、虚拟函数和动态绑定\r\n10.8 虚析构函数\r\n10.9 案例分析:用多态性和带dynamic_cast和typeid的运行时类型信息的工资发放系统\r\n10.10 本章小结\r\n\r\n第11章 模板\r\n\r\n11.1 简介\r\n11.2 函数模板\r\n11.3 重载函数模板\r\n11.4 类模板\r\n11.5 类模板与无类型参数\r\n11.6 模板与继承\r\n11.7 模板与友元\r\n11.8 模板与静态数据成员\r\n11.9 本章小结\r\n\r\n第12章 C++输入/输出流\r\n\r\n12.1 简介\r\n12.2 流\r\n12.3 输出流\r\n12.4 输入流\r\n12.5 使用成员函数Read、write和gcount的无格式输入/输出\r\n12.6 流操作元\r\n12.7 流格式状态和流操作元\r\n12.8 流错误状态\r\n12.9 把输出流连接到输入流\r\n12.10 本章小结\r\n\r\n第13章 异常处理\r\n\r\n13.1 简介\r\n13.2 异常处理概述\r\n13.3 其他错误处理技术\r\n13.4 简单异常处理例子:除数为0\r\n13.5 重抛出异常\r\n13.6 异常规范\r\n13.7 处理意外异常\r\n13.8 堆栈解退\r\n13.9 构造函数、析构函数与异常处理\r\n13.10 异常与继承\r\n13.11 处理new失败\r\n13.12 auto_ptr类与动态内存分配\r\n13.13 标准训异常的层次结构\r\n13.14 本章小结\r\n\r\n第14章 文件处理\r\n\r\n14.1 简介\r\n14.2 数据的层次结构\r\n14.3 文件和流\r\n14.4 创建顺序访问文件\r\n14.5 读取顺序访问文件中的数据\r\n14.6 更新顺序访问文件\r\n14.7 随机访问文件\r\n14.8 建立随机访问文件\r\n14.9 向随机访问的文件随机写入数据\r\n14.10 从随机访问文件中顺序读取数据\r\n14.11 案例分析:事务处理程序\r\n14.12 对象的输入/输出\r\n14.13 本章小结\r\n\r\n第15章 string类和字符串流处理\r\n\r\n15.1 简介\r\n15.2 字符串的赋值与连接\r\n15.3 比较字符串\r\n15.4 子串\r\n15.5 交换字符串\r\n15.6 字符串的特性\r\n15.7 查找字符串中的字符串和字符\r\n15.8 替换字符串中的字符\r\n15.9 在字符串中插入字符\r\n15.10 转换为C风格的char*字符串\r\n15.11 迭代器\r\n15.12 字符串流处理\r\n15.13 本章小结\r\n\r\n第16章 CGI Web编程\r\n\r\n16.1 简介\r\n16.2 HTTP请示类型\r\n16.3 多层构架\r\n16.4 访问Web服务器\r\n16.5 Apache HTTP服务器\r\n16.6 请求XHTML文档\r\n16.7 CGI概述\r\n16.8 简单的HTTP事务\r\n16.9 简单的CGI脚本\r\n16.10 把输入发送给CGI脚本\r\n16.12 其他标题\r\n16.13 案例分析:交互式网页\r\n16.14 Cookies\r\n16.15 服务器端文件\r\n16.16 案例分析:购物车\r\n16.17 Internet和Web资源\r\n16.18 本章小结\r\n\r\n第17章 数据结构\r\n\r\n17.1 简介\r\n17.2 自引用类\r\n17.3 动态内存分配\r\n17.4 链表\r\n17.5 堆栈\r\n17.6 队列\r\n17.7 树\r\n17.8 本章小结\r\n\r\n第18章 位、字符、字符串和结构\r\n\r\n18.1 简介\r\n18.2 结构定义\r\n18.3 结构初始化\r\n18.4 在函数中使用结构\r\n18.5 关键字typedef\r\n18.6 示例:高性能洗牌与发牌模拟程序\r\n18.7 位运算符\r\n18.8 位域\r\n18.9 字符处理函数库\r\n18.10 字符串转换函数\r\n18.11 字符串处理函数库中的查找函数\r\n18.12 字符串处理函数库中的内存处理函数\r\n18.13 本章小结\r\n\r\n第19章 预处理程序\r\n\r\n19.1 简介\r\n19.2 预处理程序指令#include\r\n19.3 预处理程序指令#define:符号常量\r\n19.4 预处理程序指令#define:宏指令\r\n19.5 条件编译\r\n19.6 预处理程序指令#error与#pragma\r\n19.7 #与##运算符\r\n19.8 行号\r\n19.9 预定义的符号常量\r\n19.10 宏指令(assert)\r\n19.11 本章小结\r\n\r\n第20章 C遗留代码\r\n\r\n20.1 简介\r\n20.2 UNIX和DOS系统上的输入/输出重定向\r\n20.3 变长参数列表\r\n20.4 使用命令行参数\r\n20.5 关于编译多重源文件程序的说明\r\n20.6 用函数exit与atexit终止程序运行\r\n20.7 类型限定符volatile\r\n20.8 整型数和浮点数常量的后缀\r\n20.9 信号处理\r\n20.10 用calloc与realloc进行动态内存分配\r\n20.11 无条件转向语句:goto\r\n20.12 共同体\r\n20.13 连接规范\r\n20.14 本章小结\r\n\r\n第21章 标准模板库(STL)\r\n\r\n21.1 标准模板库(STL)简介\r\n21.2 序列容器\r\n21.3 关联容器\r\n21.4 容器适配器\r\n21.5 算法\r\n21.6 bitset类\r\n21.7 函数对象\r\n21.8 因特网与万维网上有关STL的资源\r\n21.9 本章小结\r\n\r\n第22章 其他主题\r\n\r\n22.1 简介\r\n22.2 const_cast运算符\r\n22.3 reinterpret_cast运算符\r\n22.4 命名空间\r\n22.5 运算符关键字\r\n22.6 显示构造函数\r\n22.7 可变类成员\r\n22.8 类成员指针(.*和->*)\r\n22.9 多重继承\r\n22.10 多重继承和虚拟基类\r\n22.11 结束语\r\n22.12 本章小结\r\n\r\n附录A 运算符优先级表\r\n\r\n附录B ASCII字符集\r\n\r\n附录C 数值系统\r\n\r\nC.1 简介\r\nC.2 将二进制数简化为八进制和十六进制数\r\nC.3 将八进制和十六进制数转换为二进制数\r\nC.4 将二进制、八进制和十六进制数转换为十进制数\r\nC.5 将十进制数转换为二进制、八进制或十六进制数\r\nC.6 负的二进制数:补码表示法\r\nC.7 小结\r\n\r\n附录D 因特网和万维网上的C++资源\r\n\r\nD.1 资源\r\nD.2 教程\r\nD.3 FAQ\r\nD.4 Visual C++\r\nD.5 新闻组\r\nD.6 编译器和开发工具\r\nD.7 标准模板库\r\n\r\n附录E XHTML概述\r\n\r\nE.1 概述\r\nE.2 编辑XHTML\r\nE.3 第一个XHTML示例\r\nE.4 标题\r\nE.5 链接\r\nE.6 图像\r\nE.7 特殊字符和更多的换行\r\nE.8 无序列表\r\nE.9 嵌套列表和顺序列表\r\nE.10 XHTML的基本表格\r\nE.11 较复杂的XHTML表格和格式化\r\nE.12 XHTML的基本表单\r\nE.13 较复杂的XHTML表单\r\nE.14 因特网和万维网资源\r\n小结\r\n\r\n附录F XHTML特殊字符 \r\n
C++是目前在商业软件开发中占统治地位的语言,尽管Java一直在挑战这种地位,但是这两种语言具有非常的相似性,学会了一种就等于学会了另一种的90%。与微软.net平台中的C#相比,后者仅仅是前者的子集,只是在某些重要方式上有所不同。C++带给我们的一些重要的编程思想,以及极大的灵活性和给予编程人员的自由空间都是其他语言所不能代替的。因此可以说,作为面向对象编程语言的典范,C++仍然是我们学习编程语言的首选。
本书是Deitel父子编写的全球最畅销的C++程序设计教材,全书详细介绍了过程式编程和面向对象编程的基本原理和方法,包括:控制结构、函数、数组、指针和字符串、类和抽象、运算符重载、继承、虚拟函数、多态性、I/O、模板、异常处理、文件处理、数据结构和标准模板库(STL)。本书注重理论与实践的结合,每章都以若干完整的示例程序讲述编程时应考虑的一些注意事项,包括:良好编程习惯、常见编程错误、性能提示、可移植性提示、软件工程知识以及测试和调试提示。通过一个贯穿全文的电梯模拟系统案例分析,重点突出了用UML进行面向对象系统分析与设计方法。此外,本版还增加了选学的“模式探索”部分。本书是高等院校进行程序设计和C++教学的教材,是软件设计人员进行C++程序开发的宝贵参考书。
Deitel & Associates公司是一家全球知名的培训和出版公司,公司提供了对象技术和主要编程语言的课程,这些语言包括C、C++、Visual C++.NET、Visual Basic.NET、C#、Java、Advanced Java、XML、Perl、Python等等。本书的作者均是该公司的核心人员,其中Harvey M.Deitel博士是公司的首席执行官,在计算机领域已有40年的工作经验,无论专业技术还是学校教育,均有非常高的造诣;Paul.J.Deitel是公司的执行总裁,负责向业内许多知名客户讲授C、C++、Java等;Tem R.Nieto是公司的产品开发主管,同样负责向业内客户讲授课程。他们撰写了许多全球最畅销的计算机科学教材和多媒体软件包。
全书的翻译出版是集体工作的结晶。施平安、施惠琼、文家焱、蔡桂凌、施琳琼、陈华、柳赐佳、罗德良、胡丽君、周莎莎、肖巨平、卢毅、黄山松、李旭兴、张武军、黄淑惠、柳晁锦、柳晁惠、施卓成、张琼雯、张庭辉、施晓东、方杰、卢彬、程强和施红军等负责全书的翻译工作,柳玉芬、柳小艳、孔颂燕、梁锦伦、程高、蔡荣荣、陈建伟、戴寿杰、余坦克、汪阅东和陈稽康等负责全书的审校工作,施金庭、柳聿荫、施群肖和缪彩珠等负责全书的录入和排版工作。全书最后由施平安、文家焱负责统稿。
在翻译过程中,我们对本书中出现的所有术语和难词难句都进行了仔细的推敲和研究,然而有些方面在译者本人的研究领域中也不曾遇到过,疏漏和争议之处在所难免,望广大读者提出宝贵的意见,以便在再版时修正。
Harvey M.Deitel博士和Paul J.Deitel博士是Deitel&Associates公司的奠基人。
Deitel&Associates公司是一家国际认证的培训和出版公司,致力于C++、C、C#、Visual Basic.NET、Visual C++.NET、XML、Python、Perl、Internet、Web和对象技术的教学和相关产品的研发。Deitel父子俩编写了许多世界一流的程序设计语言教材,包括《C#大学教程》和《Java程序设计教程》等。
欢迎进入ANSI/ISO标准C++世界!在Deitel & Associates公司,我们编写了大学级程序设计语言教材和专业参考书,并努力使我们出版的书反映当前最新的编程技术。撰写 《C++程序设计教程》(第4版,简称4/e)是一件高兴的事。该书及其辅助材料包罗了教师和学生进行C++教育所需的一切,不愧为一套具有丰富内涵的、真正寓教于乐的计算机参考书。在本书即将出版之际,本书遵守ANSI/ISO C++标准(计算机界最重要的全球标准之一)的最新版本,并且运用对象管理组(Object Management Group,OMG)的最新版UML(Unified Modeling Language,统一建模语言)进行面向对象设计。我们调整了本书的写作风格、教学方法、编码风格以及本书的辅助软件包,增加了大量开发基于Internet和Web的应用程序的讨论。我们把“本书导读”一节放到第1章中。该导读部分有助于教师、学生和专业人员体会到本书提供的大量有关C++面向对象编程、UML面向对象设计和类属编程(generic programming)等内容。如果你要对本书进行评估,请务必阅读第l章中的“本书导读”部分。
无论你是教师、学生、有经验的专业人员,还是刚刚入门的程序员,本书都可以为你提供莫大的帮助。C++是一种世界级的编程语言,主要用于开发工业强度的、高性能的计算机应用程序。由于ANSI/ISO C++标准文档(u定义了C++,因此我们根据ANSI/ISO C++标准文档对本书的手稿进行了认真审核;并且我们被授权作为Sun Microsystems公司的Steve Clamage的审阅者。Sun Microsystems公司领导ANSI J16委员会,并负责演进C++标准。因此,通过学习本书而创建的程序,应当很容易移植到所有与ANSI/ISO兼容的编译器上。
在本前言中,我们概述了本书包含的教学材料,它们可以帮助教师使学生最大限度地掌握C++的知识内容。我们说明了本书所用的约定,诸如 “代码清洗”(code washing)及突出显示重要代码段的做法,帮助学生们将重点放在每章介绍的关键概念上。我们概述了本书的新特性,包括我们最初将数组和字符串作为对象、增强的面向对象编程的讨论、CGI Web应用程序开发、新增的UML电梯模拟面向对象设计(OO)案例分析、以及已经升级到UML标准1.4版本中UML图的扩展使用。
52位著名的大学教授和行业专家对本书进行了评审,你会从中感受到对本书的精雕细琢。前言最后给出了作者和Deitel & Associates公司的信息。在阅读本书的过程中,如果有任何疑问,请发e-mail到deitel@deitel.com:我们会从速做出处理。请定期访问我们的网站www.deitel.com,请务必在www.deitel.com/newsletter/subscribe上订阅DEITEL BUZZONLINE电子邮件通讯。我们用网站和电子邮件通讯使读者了解所有DEITEL出版物和服务的最新信息。
本书的新特性
本书包含许多新特性。
突出新代码和用户输入
我们对大量代码进行了突出表示。在代码分析(在Deitel,我们称这些为“wntearounds”)中,我们已经取消了第3版中内嵌的大部分“冗余的”代码片段。在本书的前面部分,我们保留了这些代码片段,作为一种帮助初学者的教育手段。我们希望读者根据上下文领会所有最新的代码特性,因此从第3章开始,我们的代码分析只引用完整的源程序中的新代码段的行号。为了使读者更容易确认有特色的片段,我们使用突出表示强调它们。这种代码突出也有助于学生在准备考试或者实验时快速复习材料。我们还在屏幕对话中强调了所有用户输入,以使它们区别于程序输出。
代码清洗(Code Washing)
代码清洗是我们为运用大量注释、采用有意义的标识符、采用缩进格式以及采用纵向间距隔离有意义的程序单元而提供的代名词。经过这样处理,程序将更易阅读,也更容易自我编档。
提前介绍标准库string和vector对象
面向对象编程语言一般提供了创建字符串和数组对象的能力,具体可以通过实例化库类或者程序员定义的类来实现。此外,让学生们学习C++以熟悉C的风格、指针数组和字符串也是重要的,他们将在工作中遇到大量C和早期的C++遗留代码。在本书中,我们说明了所有3种创建字符串和数组的方法。在第4章和第5章中,我们分别说明了传统的、类似于C的基于指针的数组和字符串。在第8章:字符串和数组对象中,我们创建了自定义类Array和String。在第8章末,我们介绍了库类vector和string,并分别在第15章和第21章详细介绍它们。通过第8章的学习,我们会倾向使用基于指针的数组和字符串;而在第8章以后,我们会倾向使用库类。第15章关于字符串的内容,可以在第8章后的任何时刻讲授。第21章关于vector(及STL的其他方面)的内容,也可以在第8章以后教学,尽管我们建议首先介绍第11章“模板”。
第9章和第10章调整了对面向对象程序设计的讨论
这是本次新版教材的最明显的改进之一。我们对第9章和第10章进行了精心改进。这种改进使材料更加清楚,使学生和专业人员,尤其是那些首次学习面向对象的人,更容易使用这些素材。
重新设计了第9章的教学法。新的第9章通过5个精选的例子,循序渐进地向读者说明了private数据、protected数据以及通过继承的软件重用。首先,说明了一个用private数据成员和public成员函数操纵数据的类。然后,通过增加几个功能实现了第二个类。为了实现该类,我们复制了第一个例子的大部分代码。第3个例子开始讨论继承和软件重用——我们用第一个例子中的类作为基类,并在新的派生类中继承它的数据和功能。该例子介绍了继承机制,说明了一个派生类不能直接访问其基类的private成员。这就促成了第四个例子,该例子介绍了基类中的protected数据,说明了派生类确实能访问从基类继承的protected数据。最后一个例子说明了正确的软件工程,把基类的数据定义为private,并从派生类使用基类的public成员函数(它们被派生类继承)操纵派生类的private数据。这5个例子按三级类层次结构的顺序进行介绍,利用了该章前面介绍的软件工程技术。该章最后讨论了C++支持的3种继承类型,并简要地讨论了有关继承的软件工程。
重新设计了第10章的教学法。新的第10章建立在第9章介绍的继承概念之上,重点考虑类继承层次结构中类间的关系。第10章用4个例子介绍了这些关系提供的强大的处理能力。第1个例子说明了派生类对象同其基类类型间的“is-a”关系,这种关系使派生类对象能够被看成其基类的一个对象。我们说明了能够用一个基类指针引用一个派生类对象,并调用了基类关于那个对象的方法。在第2个例子中,我们举例说明了相反的情况不成立,即,不能将一个基类对象看成其派生类类型的对象,并表明,如果一个程序试图以这种方式操纵一个基类对象,则编译器会提示出错。第3个例子说明了唯一能够通过基类指针调用的函数是那些被基类定义的函数。该例子表明,如果基类试图调用只有派生类才有的方法,则编译器会提示出错。最后一个例子用虚拟函数讨论了多态机制,它使一个程序能够作为基类类型的对象处理与一个类层次结构关联的类对象。当通过一个基类指针(或者引用)调用一个虚拟函数时,则调用那个函数的派生类专用的版本。该章接着介绍了一个关于多态性的案例分析。在这个案例分析中,我们处理一个具有公共抽象基类的对象数组,抽象基类包含了类层次结构中每个类共有的函数集。我们根据这个例子深入探查了多态性工作的奥秘。最后以一个案例分析结束本章,说明了通过确定执行时当前正被处理的对象类型,一个按多态性处理对象的程序仍然能够执行专用类型的处理。
使用CGI进行Web应用程序开发
第16章是本书新增的内容,提供了读者着手开发在Internet上运行的基于Web的应用程序所需的一切!读者将学习如何构建所谓的n层应用,其中每层提供的功能,可以通过Internet分布于不同的计算机上,也可以在相同的计算机上执行。尤其,我们构建了一个3层联机书店应用程序。书店的信息存储在应用程序的数据层。在工业强度的应用程序中,数据层通常是Oracle、Microsoft SQL Server或者MySQL等数据库。为了简单起见,我们采用文本文件,并利用第14章的文件处理技术存取这些文件。用户在应用程序的客户层输入请求及接收响应,客户层通常是一台运行Web浏览器(诸如Microsoft Internet Explorer或者Netscape等)的计算机。无疑,Web浏览器知道如何通过Internet与Web站点通信。中间层包含一个Web服务器和一个应用程序专用的C++程序(例如,我们的书店应用程序)。Web服务器通过CGI协议与C++程序通信,反之亦然。我们用流行的Apache HTTP服务器作为Web服务器,Apache HTTP服务器可以从www.apache.org免费下载。Web服务器知道如何用超文本传输协议(Hyper Text Transfer Protocol,HTTP)通过Internet与客户层通信。我们讨论了Web服务器在Web编程中的关键作用,并提供了一个从Web服务器请求Web页的简单例子。我们讨论了CGI及其如何允许一个Web服务器与顶层和CGI脚本(即,我们的C++程序)进行通信。我们提供了一个从服务器中获取时间和日期并在一个浏览器中进行显示的简单例子。在我们的基于窗体的例子中,我们用按钮、密码域、复选框和文本域。我们介绍了一个旅游公司的交互式门户网站的例子,显示飞往各大城市的飞机票价格。旅行俱乐部的的成员可以登录该应用程序,查看打折机票。我们还讨论了各种存储客户专用数据的方法,包括隐藏的域(即,存储在Web页中的信息,但是Web浏览器不能显示它)和cookies——浏览器存储在客户机上的小型文本文件。本章最后介绍了一个在线书店的电子商务案例分析的例子,它允许用户把书加入一个电子购物车。该案例分析包含几个CGI脚本,它们互相交互形成一个完整的应用程序。联机书店受密码保护,因此用户必须首先登录网站以获取访问权。
XHTML
W3C(World Wide Web Consortium,万维网联盟)声明HTML(Hyper Text Markup Language,超文本标记语言)为一种遗留技术,今后不再继续发展。HTML即将被XHTML (Extensible Hyper Text Markup Language,可扩展超文本标记语言)取代——XHTML是一种基于XML的技术,很快就成为了描述Web内容的标准。我们在第16章“CGI Web编程”中运用XHTML;附录E提供了XHTML简介。如果你不熟悉XHTML,请在阅读第16章之前先阅读附录E。
统一建模语言(UML)
统一建模语言(Unified Modeling Language,UML)已经成为面向对象系统设计优选的图形化建模语言。在上一版中,我们只是在可选部分采用了UML,并用常规的流程图和继承图强调说明。然而,在本书中,我们已经把所有图都转变成符合UML l.4标准。尤其,我们更新了UML/OOD电梯模拟案例分析中的图;我们把第2章“控制结构”中的所有流程图转变成UML活动图;并且把第9、12、14和22章中的所有继承图转变成UML类图。
本书精心调整了可选(但是极力推荐)的案例分析,都是用来介绍使用UML进行面向对象设计的。在案例分析中,我们完全实现了一个模拟。在第1~7和9章末尾的“对象思想”部分,我们逐步地、仔细地介绍了UML面向对象设计。我们提供了—个简明扼要的UML子集,然后引导读者亲身体会第一个设计,这是一个为刚刚入门的面向对象设计者或者程序员准备的设计。案例分析本身就是完整的解决方案。它不是一个练习,而是一个端到端的学习经历,并在最后详细分析了C++代码。在前面5章中,我们主要讨论“常规的”结构化编程方法,因为我们构建的对象将使用这些结构化程序部件。每章以一节“对象思想”结束,对象思想主要介绍UML面向对象设计。这些“对象思想”小节有助于学生发展面向对象思维方式,以便他们在开始学习第6章时就能运用面向对象编程概念。在第1章末尾的“对象思想”中,我们介绍了基本概念(对象思想)和术语(对象语言)。在第2~5章末尾可选的“对象思想”部分,我们讨论了更加本质的问题,因为我们要用OOD(Object-Oriented Design,面向对象设计)技术承担一个具挑战性的难题。我们分析了一个典型的问题陈述,它要求构建一个系统、确定实现该系统所需的对象、确定这些对象必须有的属性、确定这些对象需要展示的行为以及规定对象必须怎样互相交互以满足系统的需求。我们甚至在开始讨论如何编写面向对象C++程序前完成了这一步工作。在第6、7和9章后面的“对象思想”部分,我们用C++实现了前面几章设计的面向对象系统。该项目使我们能够结合本书的所有其他地方没有讨论过的主题,包括对象交互、句柄的深入讨论、使用引用与指针的基本原理以及运用正向声明避开循环包含问题。该案例分析将为学生以后在行业中遇到的各种项目作好准备。我们采用一个精心研制的、增量式面向对象设计过程为我们的模拟产生了一个基于UML的设计。根据这种设计,我们用关键的编程概念产生了大量可实际运行的C++实现,包括类、对象、封装、可见性、组合和继承。
关于(可选的)模拟系统案例分析的更多信息
该案例分析在上一版引入,并在本书中做了精心的调整。我们使所有的UML图符合UML 1.4版本;对许多图重新进行了组织,使它们更加清楚;我们对本书介绍的完整的C++方案进行了完全的代码清洗;并且调整了该案例分析的讨论,使它们更加清晰和精确。我们把这些案例分析提交给著名的OOD/UML评审团队,包括该领域的领军组织Rational公司(UML的创建者)和对象管理组(负责UML的维护和演进)。
在第2章,我们开始了模拟的面向对象设计的第一阶段——确定实现该模拟器所需的类。我们还介绍了UML用例、类和对象图,以及关联、多重性、组合、角色和链接等概念。在第3章,我们确定了实现电梯模拟器所需的许多类属性,我们还介绍了UML状态图和活动图,以及与这些图有关联的事件和动作。在第4章,我们确定了电梯模拟系统涉及的类的许多操作(动作)。我们还介绍了UML顺序图及对象间传递的消息的概念。在第5章,我们确定了实现电梯模拟所需的协作(系统对象间的交互集),并用UML协作图表示这些交互。我们还提供了一个参考书目和一个Internet和Web网资源清单,包括UML l.4规范和其他参考资料、基本资源、指南、FAQ、文章、白皮书和软件。在第6章,我们用前几章开发的UML类图概括了对类进行定义的C++头文件。我们还介绍了系统对象中句柄的概念,并且开始研究如何用C++实现句柄。在第7章,我们提供了完整的电梯模拟系统C++程序(大约1200行代码),并对它进行了详细的代码分析。代码直接遵循前几节创建的基于UML的设计,并且采用了我们的最佳编程习惯。我们还讨论了动态内存分配、组合、通过句柄进行对象交互,以及如何用正向声明避开循环包含问题。在第9章,我们更新了电梯模拟系统的设计和实现,使其结合了继承,并提出了进一步的修改建议。
标准模板库(STL)
就我们对软件重用的欣赏角度看,这也许是本书最重要的章节。STL定义了强大的、基于模板的、可重用的组件,它们实现了许多常见的数据结构以及用于实现这些数据结构的算法。第21章介绍STL,并讨论了它的3个关键成分——容器、迭代器和算法。STL容器是能够存储任何数据类型的对象的数据结构。我们说明了三种容器类型——首类容器、适配器和近似容器。STL迭代器类似于指针(但是比指针更安全),由程序用来操纵STL容器元素。实际上,使用标准指针作为迭代器,标准数组可以作为STL容器进行操纵。我们说明了用迭代器操纵容器是方便的,当与STL算法结合时会大大提高表达能力——在某些情况下,可以减少一个结构的许多行代码。STL算法是函数,执行常见的数据操作,诸如元素(或者整个数据结构)的查找、排序和比较等。STL大约实现了70个算法:这些算法包含常见的容器运算,诸如查找一个元素、元素排序、元素比较、元素删除、元素替换,等等。大多数算法使用迭代器存取容器元素。我们说明了每个首类容器支持专门的迭代器类型,其中一些比另一些功能更强大。容器支持的迭代器类型确定了该容器是否能够用一个专门的算法使用。迭代器封装了用于存取容器元素的机制。这种封装使许多STL算法能够应用于各种容器,而不必考虑基本容器实现。只要容器的迭代器支持算法的最小需求,该算法就可以处理该容器的元素,这也使程序员能够处理多个容器类型的元素的算法。STL的一个好处是,程序员可以重用STL容器、迭代器和算法以实现常见的数据表示和操纵。这种重用节约了大量开发时间和资源。
教学方法
本书面向的对象是初级和中级读者。我们并不想覆盖C++标准的每个特征。C++已经
取代了C语言,成为了工业的高性能系统实现语言的选择。然而,C语言编程仍然是一种
重要而有价值的技能,因为业内必然包含大量C遗留代码。我们指出了其中的陷阱,并说
明了有效地解决它们的措施。当学生们了解到他们正在学习一种前沿语言(C++)和一种
前沿编程范型(面向对象编程),并且他们一走出校园马上就有用时,肯定会激起高昂的
学习积极性。
本书含有大量例子、练习和项目,它们选自许多不同领域,目的是为学生提供解决有趣的、现实问题的机会。本书中的代码例子都在多个编译器——Microsoft Visual C++ 6、Microsoft Visual C++.NET、Borland C++ Builder的两个版本以及GNU C++的两个版本上测试过。本书中的大多数程序可以在所有符合ANSI/ISO标准的编译器上运行;我们在www.deitel.com上公布了我们发现的几个问题。有可能的话,我们还会公布额外的代码调整,以使程序能够在特定的编译器上运行。
本书主要考虑良好的软件工程原则,并强调了程序清晰性。本书的作者大部分时间都致力于讲授与流行的编程语言有关的知识,本书强调了良好的教学法。
活代码方式
本书附有大量活代码(Live-Code)例子。对于每个新概念,都用一个完整的、能实际运行的例子进行介绍,同时后面直接附有一个或者多个示例执行,以表明程序的输入/输出对话。这种风格举例说明了讲授和编写程序的方式,并且是我们的多媒体网络课堂和基于Web的培训课程的核心。我们把这种讲授和编写的方法称为活代码方法。我们用程序化语言讲授编程语言。在阅读本书的例子时,就像在一台计算机上输入和运行它们一样。
万维网访问
本书(以及其他出版物)的所有源代码例子,都可以通过Internet在如下Web站点上下载:
www.deitel.com
www.prenhall.com/deitel
注册非常快捷简便,并且下载是免费的。我们建议大家下载所有例子,然后在阅读相应的内容时运行每个程序。改变例子,然后立即查看这些改变产生的效果,这是—种增强C++学习经验的有效方法。
学习目标
每章都以学习目标开头,目的是使学生知道每章的学习主题。而且在学完每章后,使他们有机会确定它们是否达到预期的目标。学习目标有助于学生树立信心。
267个示例程序(及程序输出),共20704行代码
我们用完整的、可实际运行的C++程序来讲解C++的特性。这些活代码程序既有寥寥几行的代码,也有包含几百行代码的实际例子。每个程序后面都附有—个窗口,包含程序运行时产生的结果,有助于学生确认程序是否如期望的那样运行。将输出结果与产生这些结果的程序语句关联起来,对于概念的学习和巩固,将起到意想不到的作用。我们的示例程序将涉及C++的各种特性。程序代码中C++关键字、注释和其他程序文本分别用不同的灰度显示。这就使代码阅读更加容易——尤其当学生阅读我们介绍的更大型程序时,会更加欣赏这种语法渲染。本书的所有例子,可以从www.deitel.com网站上下载。
598个插图/图表
本书包含大量图形、绘线图、程序及程序输出。我们已经将所有流程图转变成UML活动图。我们还在第9、10、12、14和22章中用UML类图对整本书的类间关系进行建模。
601条编程提示
我们包含了6种类型的编程提示,以帮助学生将重点放在程序开发、测试和调试、性能以及可移植性的重要方面。我们采用如下形式,突出了几百个类似的提示,包括:良好编程习惯、常见编程错误、性能提示、可移植性提示、软件工程知识以及测试和调试提示。这些提示和编程习惯是我们几个人综合60年编程和教学经验的结晶。我们的—名数学专业的学生告诉我们,她感觉这种方法犹如突出数学教材上的公理、定理和推论;牢记这些编程提示,有助于打造出优秀的软件。
良好编程习惯(共90条)
良好编程习惯是要求学生注意编写清晰的程序的技术。这种技术有助于学生写出更好。阅读、更易理解以及更容易维护的程序。以前,我们向非程序员出身的人讲授入门级课程时,都明确地强调每堂课的“专用术语”。同时还告诉学生们,只要某种技术有助于写出结构更清晰、更易理解和更易维护的程序,便会对其重点介绍(本书中,则以“良好编程习惯”的形式表达出来)。
常见编程错误(共198条)
学生们在学习一种语言(特别是上第一门编程课)时,经常会犯某些错误。把注意力放在这些“常见编程错误”上,有助于避免重犯同样的错误。此外,这样也可大大减少教师的工作。
性能提示(共88条)
根据我们的经验,对于学习第一门程序设计课的学生,教他们编写清晰的、易于理解的程序仍是迄今为止最重要的目标。但是学生们喜欢编写速度奇快、资源占用最少而且击键次数最少的程序,实际上他们关心的是性能。他们希望知道自己的程序经过哪些调整之后便可改善性能。因此,我们提供了“性能提示”以强调改善程序性能的时机——使程序运行得更快,或者使它们占用的内存最小。
可移植性提示(共36条)
软件开发是一项复杂且成本极高的过程。软件开发组织通常需要开发不同版本的软件,以适应不同计算机、不同操作系统的需要。因此,如今的软件开发项目无一例外地对可移植性提出了严格要求。换言之,一个软件应该只需少量修改(或者根本不用修改),便能在其他平台上运行。一些程序员认为,如果他们用标准C++实现应用程序,应用程序将是可移植的,情况并非如此简单。实现可移植性需要仔细而谨慎的设计。在这方面存在许多陷阱。我们提供了“可移植性提示”,以帮助学生们编写可移植的代码,同时提供有关C++如何实现其高度可移植性的理解。
软件工程知识(共149条)
面向对象编程范例要求完全重新考虑软件系统的构建方式。C++是一种可以有效地实现良好的软件工程的语言。软件工程知识强调了影响软件系统构造的构架和设计问题,尤其是大型系统。学生们在此学到的大多数知识,对于他们深造走上工作岗位或者是开始接触大型、复杂的现实系统时有用的。
测试和调试提示(共38条)
当我们第一次设计这种“提示类型”时,曾考虑这些“提示”应包含各种建议,参照这些建议可以找出并消除程序中的Bug。事实上,许多这样的提示描述了C++的功能与特性,它们可从源头阻止Bug进入我们的程序,从而简化了测试和调试过程。
小结(875条)
各章均以小结的形式结束。我们以加重号清单的风格提供了每章的小结。每章平均有40条小结,这些小结有助于学生复习和巩固关键概念。
术语(1782个)
在术语部分,按字母顺序列出了每章定义的重要术语—再次强调,这是为了进—步巩固各章介绍的知识。每章平均有81个术语。读者可以快速找到这些术语和定义。
555道自测题及答案
所有的自测题和答案针对自学而精心设计。这部分内容使学生能够建立起深入学习的信心,并为参加正规考试做好准备。
800道练习题
每章最后都提供了练习题,包括回顾重要术语和概念;编写单个C++语句;编写小部分的C++函数和类;编写完整的C++函数、类和程序;以及编写重大的学期项目。由于存在各领域的大量练习题,使教师能够调整课程适应学生的特殊需要,每学期也可改变课程安排。根据练习题,教师可以安排家庭作业、小测验以及大型考试。全书练习题的答案和解题思路和过程,可以从清华大学出版社出版的《C++程序设计教程参考手册》中查阅。
由于编程语言的学习是一个实践性很强的过程,没有大量的练习是很难熟练掌握的,本质上编程语言的学习是一个经验积累的过程。尤其是像C++这种较难掌握的语言,更需要大量的实践经验。因此实验手册在学习过程中是非常重要的,与本书配套的上机指导书 《C++程序设计教程实验手册》(亦由清华大学出版社出版),完全秉承了本书严谨、细致、循序渐进的风格。通过一系列由浅入深的实验练习使学生能够巩固所学的知识。—本好的实验手册可以为学习者收到事半功倍的效果,更为重要的是,由于本书的对象为初中级读者,因此它提供的这种良好的思维方式将对学生进一步的学习起到深远的影响。