作为全球使用最广泛的C++经典程序设计教材,本书详细介绍了过程式与面向对象程序设计的基本知识与方法,其中包括C++的强大功能、最新特性和新增的ANSI/ISO C++标准库。\r\n 本书通过面向一个大型对象(电梯模拟系统)的程序设计,以数百个“活代码”示例程序,重点突出了利用UML进行面向对象的设计。分布在各章的“对象思想”、“案例分析”、“常见编程错误”、“良好编程习惯”、“自测题”和“练习题”等特色部分非常具有实际指导意义,不仅可让接触C++的新手真实体验编程乐趣,还可让有经验的程序员得到启发。\r\n 本书的读者对象为计算机软件、系统和网络编程人员,也可作为大学计算机相关专业本科生和研究生的编程教材和参考书。
前言\r\n\r\n第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和《Java程序设计》\r\n1.10 其他高级语言\r\n1.11 结构化编程\r\n1.12 关键的软件趋势:对象技术\r\n1.13 典型C++环境的基础\r\n1.14 硬件发展趋势\r\n1.15 因特网发展简史\r\n1.16 万维网发展简史\r\n1.17 C++和本书的常规注意事项\r\n1.18 C++编程简述\r\n1.19 一个简单的程序:打印一行文字\r\n1.20 另一个简单的程序:两个整数相加\r\n1.21 内存的概念\r\n1.22 算术运算\r\n1.23 判断:相等性和关系操作符\r\n1.24 对象思想:对象技术及UML简介\r\n1.25 小结\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 递归应用示例:费波拉奇数列\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.3 指针和数组的关系\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 用class实现Time抽象数据类型\r\n6,6 类作用域和访问类成员\r\n6.7 接口同实现方法的分离\r\n6.3 控制对成员的访问\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 常量对象和常量成员函数\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 小结\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 public、Protected和Private继承\r\n9.8 直接基类和间接基类\r\n9.9 在派生类中使用构造和析构函数\r\n9.10 派生类向基类的隐式转换\r\n9.11 继承在软件工程中的应用\r\n9.12 合成与继承\r\n9.13 "使用"关系和"知道"关系\r\n9.14 案例分析:Point,Circle和Cylinder类\r\n9.15 多重继承\r\n9.16 [可选案例分析]对象思想:在电梯模拟程序中集成继承\r\n9.17 小结\r\n\r\n第10章 虚拟函数和多恋性\r\n\r\n10.1 简介\r\n10.2 类型域和switch语句\r\n10.3 虚拟函数\r\n10.4 抽象基类和具体类\r\n10.5 多态性\r\n10.6 案例分析:使用多态性的工资发放系统\r\n10.7 新类和动态绑定\r\n10.8 虚拟析构函数\r\n10.9 案例分析:继承接口和实现\r\n10.10 多态性、虚拟函数和动态绑定的本质\r\n10.11 小结\r\n\r\n第11章 C++输入/输出流\r\n\r\n11.1 简介\r\n11.2 流\r\n11.3 输出流\r\n11.4 输入流\r\n11.5 成员函数read,gcount和write的无格式输入/输出\r\n11.6 流操纵元\r\n11.7 流格式状态\r\n11.8 流错误状态\r\n11.9 把输出流连接到输入流\r\n11.10 小结\r\n\r\n第12章 模板\r\n\r\n12.1 简介\r\n12.2 函数模饭\r\n12.3 重载模板函数\r\n12.4 类模板\r\n12.5 类模板与无类型参数\r\n12.6 模板与继承\r\n12.7 模板与友元\r\n12.8 模板与静态数据成员\r\n12.9 小结\r\n\r\n第13章 异常处理\r\n\r\n13.1 简介\r\n13.2 何时使用异常处理\r\n13.3 其他错误处理方法\r\n13.4 C++异常处理基础:try.throw和catch\r\n13.5 简单的异常处理例子:除数为()\r\n13.6 抛出异常\r\n13.7 捕捉异常\r\n13.8 重抛出异常\r\n13.9 异常的规约\r\n13.10 处理意外异常\r\n13.11 堆栈解退\r\n13.12 构造函数、析构函数与异常处理\r\n13.13 异常与继承\r\n13.14 处理new失败\r\n13.15 auto_ptr类与动态内存分配\r\n13.16 标准库异常的层次结构\r\n13.17 小结\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章 数据结构\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\n\r\n第16章 位、字符、字符串与结构\r\n\r\n16.1 简介\r\n16.2 结构的定义\r\n16.3 结构的初始化\r\n16.4 在函数中使用结构\r\n16.5 关键字typedef\r\n16.6 示例:高性能洗牌与发牌模拟程序\r\n16.7 位操作符\r\n16.8 位段\r\n16.9 字符处理函数库\r\n16.10 字符串转换函数\r\n16.11 字符串处理函数库的查找函数\r\n16.12 字符串处理函数库中的内存处理函数\r\n16.13 字符串处理函数库中的其他函数\r\n16.14 小结\r\n\r\n第17章 预处理程序\r\n\r\n17.1 简介\r\n17.2 预处理程序指令#include\r\n17.3 预处理程序指令#define:符号常量\r\n17.4 预处理程序指令#define:宏指令\r\n17.5 条件编译\r\n17.6 预处理程序指令#error与#Pragma\r\n17.7 操作符#与##\r\n17.8 行号\r\n17.9 预定义符号常量\r\n17.10 宏指令(assert)\r\n17.11 小结\r\n\r\n第18章 C遗留代码\r\n\r\n18.1 简介\r\n18.2 UNIX与DOS系统中的重定向输入/输出\r\n18.3 变长参数列表\r\n18.4 使用命令行参数\r\n18.5 编译多个源文件程序的相关说明\r\n18.6 用函数exit与atexit终止程序运行\r\n18.7 类型限定符volatile\r\n18.8 整数和浮点数常量的后缀\r\n18.9 信号处理\r\n18.10 用calloc与realloc动态内存分配\r\n18.11 无条件转向语句:goto\r\n18.12 联合体\r\n18.13 接合规约\r\n18.14 小结\r\n\r\n第19章 string类和字符串流处理\r\n\r\n19.1 简介\r\n19.2 字符串的赋值与拼接\r\n19.3 比较字符串\r\n19.4 子串\r\n19.5 交换字符串\r\n19.6 字符串的特性\r\n19.7 查找字符串中的字符\r\n19.8 替换字符串中的字符\r\n19.9 在字符串中插入字符\r\n19.10 转换为C风格的char*字符串\r\n19.11 迭代器\r\n19.12 字符串流处理\r\n19.13 小结\r\n\r\n第20章 标准模板库(STL)\r\n\r\n20.1 标准模板库STL简介\r\n20.2 序列容器\r\n20.3 关联容器\r\n20.4 容器适配器\r\n20.5 算法\r\n20.6 bitset类\r\n20.7 函数对象\r\n20.8 小结\r\n\r\n第21章 标准C++语言的增补\r\n\r\n21.1 简介\r\n21.2 布尔数据类型\r\n21.3 static_cast操作符\r\n21.4 const_cast操作符\r\n21.5 reinterpret_cast操作符\r\n21.6 名称空间\r\n21.7 运行时类型信息(RTTI)\r\n21.8 操作符关键字\r\n21.9 显式构造函数\r\n21.10 mutable类成员\r\n21.11 类成员指针(.*和->*)\r\n21.12 多重继承和虚拟基类\r\n21.13 结束语\r\n21.14 小结\r\n\r\n附录A 操作符的优先级和结台性\r\n附录B ASCII字符集\r\n附录C 数值系统\r\n\r\nC.1 简介\r\nC.2 将二进制数简化为八进制和十六进制数\r\nC.3 将八进制和十六进制数转换为二进制数\r\nC.4 将二进制、八进制或十六进制转换为十进制\r\nC.5 将十进制转换为二进制、八进制或十六进制\r\nC.6 负的二进制数:2的补值记号法\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 comp.lang.C++\r\nD.6 编译工具\r\nD.7 开发工具\r\nD.8 标准模板库
欢迎进入ANSI/IS0标准C++的世界!本书由一位老作者和一位年青作者撰写。老作者H.M.Deitel先生(1967年毕业于麻省理工学院)已有39年的编程及教学经验。年青作者P.J.Deitel先生(1991年毕业于麻省理工学院)已编了18年的程序,现已成为教学和写作的高手。老作者凭经验编程、教学;年青人则凭着好像永远用不完的旺盛精力努力工作。老作者希望程序有一个清晰的结构;年青人则希望程序具有强劲的性能。老作者追求程序的优雅与典范,年青人却更强调程序结果。两者结合在一起,本书便成为读者必备的工具书。我们的愿望很简单,希望读者在本书中找到有用的信息,既能感受到适度的挑战,又能获得无穷乐趣!
现在处于C++世界激动人心的变革时期,人们为了ANSI/ISO C++标准的正式通过而欢呼雀跃。ANSI(美国国家标淮协会)和IS0(国际标准化组织)通力合作,为计算机世界制定了最重要的、具有里程碑意义的全球化标准之一。
在编写本书的第2版时,我们将它定位于大学的程序设计课程。当时,学生们主要学的是Pascal或C,重点强调的是过程式编程思想。为计算机系的一二年级学生编写一本C++教科书,对我们而言无疑是一项艰巨的挑战。我们需要同时讲解两种编程思想,包括过程式编程(C++中仍然含有C)和面向对象编程。这就要求我们在入门级别上,同时准备两份数量相当的材料。为此,我们采取的策略是在前5章中,用C风格的材料讲解基本数据类型、控制结构、函数、数组、指针、字符串和结构。然后在第6-15章中,讲解面向对象编程。
本书迅速成为全球使用最广的C++大学编程教材。而我们之所以推迟编写新版本,有以下两方面原因:
(1)在这段时间内,C++正在经历活跃的开发过程,标准文档的新版草案频繁出现。但标准协会那一方,尚无明确的信号表明草案标准会在短时间内被接纳为正式标准。
(2)我们一直在等侯一个关键的信号,以便适时推出新版。1997年7月,当Bjarne Stroustrup推出《The C++ Programming Language》的第3版时,那个信号终于到来了。Stroustrup是C++之父,而他的书是C++语言最权威的著作。此时,C++的"新定义"对我们来说已经足够,完全可以出版第3版了。
后来又过了一段时间,我们转移了注意力,出版了5本有关Java书籍。但由于ANSI/ISO C++草案标准的正式接纳时间迫在眉睫,所以我们的注意力又回到了C++身上。
《C++编程金典(第3版)》
我们对第3版进行了全面的审查,进行了上千处润色性的改动。我们还对书中的程序进行彻底的更新,使其更符合C++标准中“名称空间”的使用。
第3版最主要的新特点便是采用UML(Unified Modeling Language,统一建模语言),实现了一个完整的关于面向对象设计的案例分析。我们觉得,在现有的各种入门性编程教科书中,好像都缺乏对一个较大规模的面向对象设计项目的分析。这个案例分析是我们强烈推荐的,因为它能显著增强学生在第一年大学编程学习中的体验。这个案例分析为学生提供了一个绝佳的机会,可实际地接触一个上千行的C++程序。来自不同行业和学校的审稿人对其进行了严格的检查。
在本书以前的版本中,我们在第1-7章的末尾,包括了特殊的“对象思想”小节。这些小节将带领学生经历设计一个电梯系统软件模拟程序的全部步骤。我们要求学生们完成所有这些步骤,并用自己编写的C++程序来实现这个设计。但在《C++编程金典(第3版)》中,我们完全修改了这个案例分析。在第1-7章末尾,以及在第9章末尾,我们会用“对象思想”小节展示一个循序渐进的、使用UML进行的面向对象设计。目前,UML是应用得最广泛的图形表示方案,特别适合面向对象的系统建模。UML是一种复杂的、具有丰富特性的图形化语言。在我们的“对象思想”小节中,会展示这些特性的一个简明的子集。然后,会利用这个子集,面向刚人门的面向对象设计者和编程人员,指导读者获得使用UML的初期设计经验。我们将采取一种完全解决好的格式,来展示这个案例分析。注意这并不是一个练习;相反地,它是一种面对面的学习过程,而且都有详细的、逐步指导的C++代码作为总结。
在前5章的每一章中,我们都将重点放在结构化编程的“常规”方法上,因为即将构建的对象至少一部分是用结构化编程的单元构建起来的。然后,我们会用一个“对象思想”小节结束每一章,在其中采取UML来介绍面向对象的理论。在这些“对象思想”小节,我们的目标是帮助学生建立起一种面向对象的思维方式。这样一来,从第6章开始,马上就能实际应用面向对象的编程概念。在第1章必读的“对象思想”小节中,我们讲解了基本概念(即“对象思想”)和术语(即“对象描述”)。在第2-5章可选的“对象思想”小节中,对更基本的问题进行了探讨,并准备利用面向对象设计(00D)来解决一个颇具挑战性的问题。我们分析了一个典型的问题陈述,它要求构建一个系统,决定系统需要实现的对象,决定对象需要具有的属性,决定这些对象需要呈现的行为,并指定对象之间如何交互以满足系统要求。甚至在讲解如何编写面向对象的C++程序之前,就会做完上述全部事情。在第6章、第7章和第9章末的“对象思想”小节中,我们讨论了该面向对象系统的C++实现。
这个案例分析要比书中的其他项目大得多。读者走一遍这个完整的设计和实现过程,可获得可观的经验。项目使我们能合并讲解本书其他任何小节没有讨论到的一些主题,包括对象交互、有关句柄的深度讨论、使用引用和指针的原则以及使用提前声明来避免循环包容问题等等。掌握了这个案例,学生们将能更自信地迎接行业内各种实际项目的挑战。
“对象思想”小节
第2章,我们开始电梯模拟程序第一阶段的面向对象设计(00D)--标识出实现模拟程序所需的类。此外还讲解了UML的用法例图、类图和对象图,以及关联、多重性、合成、参与者和链接的概念。
第3章探讨了实现电梯模拟程序所需的许多类属性。同时还讲解了UML状态图和活动图,讲解了事件和行动的概念,以及它们同这些图之间的关系。
第4章探讨了电梯模拟程序中类的多种操作(行为),介绍了UML顺序图,并讲解了在对象之间发送消息的概念。
第5章探讨了多种合作关系(系统中各对象之间的交互),它们是实现电梯系统必需的,并用UML合作图来表示这种关系,还提供了一个因特网和Web资源列表,其中包含了UML1.3规范以及其他参考材料、常规资源、教程、FAQ、文章、白皮书和软件等。
第6章用前面开发的UML类图来概括C++头文件,以便对所需的类进行定义,还讲解了系统中各对象使用的handle的概念,并开始学习如何用C++来实现handle。
第7章展示了一个用C++语言编写的、完整的电梯模拟程序(约有1000行代码),详细地、循序渐进地讲解了所有代码。这些代码直接基于以前小节创建的UML设计,并遵循我们讲解的所有良好编程习惯,包括使用静态和常量数据成员及函数等;还讨论了动态内存分配、通过handle进行合成和对象交互,以及如何利用提前声明来避免循环包容问题等等。
第9章,开始更新电梯模拟设计和实现,以便在其中集成“继承”的概念;还提供了进一步修改它的建议,使学生能利用以前小节展示的工具,自行设计和实现。
真心地希望这个最新的电梯模拟案例能同时为学生和老师提供一个富有挑战性、同时又极有意义的项目设计体验。我们采取一个精心开发的、循序渐进的面向对象过程,为我们的电梯模拟程序生成一个基于UML的设计。根据这个设计,我们采用一系列关键的编程记号法(包括类、对象、封装、可见性、合成和继承),生成了一个能实际工作的C++实现。
其他参考资料
我们经过艰苦工作,除写出这一本极其出色的教科书之外,还精心制作了大量参考资料,希望能对老师和学生们有用。有以下参考资料可供大家利用:
● 示例程序可从www.deitel.com下载。注意示例程序源代码已压缩成ZIP格式,必须使用像WinZip(www.winzip.com)或PKZIP(www.pkware.com)这样的ZIP工具把它们解到硬盘(注意,保留原来的目录结构)。选择解压的目标目录时,应指定一个单独的目录(比如cpphtp3e-examples)。
● 配套网站(www.prenhall.com/deitel)为老师和学生提供了大量有用的资源。为老师提供的资源包括教科书的附录(比如附录D“因特网和Web上的C++资源”)以及一个教学大纲管理器,以便对课程进行计划。至于为学生提供的资源,则包括每章学习目标、判断正误习题、每章重点、参考资料和一个消息板。
● 可自定义的PowerPint Instructor Lecture Notes(PowerPoint教师讲义),提供许多完整的特性,包括每个程序的源码和讨论要点,以及主要的插图等等。这些讲义均可在www.deitel.com免费下载。
软件开发的革命
多年来,硬件以惊人的速度发展着,但由于这样或那样的原因,人们每一次试图让软件变得更快和更好时,总会遇到某些限制。如今,我们正处在一场轰轰烈烈的软件设计和编程革命的中期。这个革命基于标准化、可互换部件的记号法--这其实正是亨利·福特在T型福特车的年代所采用的方法。这些软件部件或组件即所谓的“对象”--更准确地说,就是“类”,对象将在它们的基础上生成。
各种著名的面向对象语言中,最成熟的是施乐公司Palo ALto研究中心在20世纪70年代初开发成功的Smalltalk。但目前使用最广泛的面向对象语言(用户群是Smalltalk的10倍)是C++(该语言在20世纪80年代初,由AT&T公司的Bjarne Stroustrup等人开发成功)。在本书第l版和第2版的出版间隙中,另一个强大的竞争者问世了,它就是Java面向对象编程语言,该语言是James Cosling等人于20世纪90年代初在Sun Microsystems开发成功的。
为什么每隔10年,就会有一种意义重大的、新的面向对象编程语言问世呢?Smalltalk作为一项研究成果,无疑颇为超前。C++则恰逢其时,可满足今天高性能系统编程和应用程序开发的需要。Java则使开发者能创建具有高度可移植性的多媒体密集型和网络密集型因特网/Web应用程序。
过程式编程、基于对象的编程、面向对象的编程和泛型编程
学习本书,您能掌握C++的5个关键组件,以及4种同时期的编程思维模式:
(1)C过程式编程--第1-5章和第16-18章:主要包括数据类型、控制结构、函数、数组、指针、字符串、结构、位处理、字符处理、预处理等等。
(2)C++在C基础上进行的过程式编程改进---3.15~3.21节:主要包括内联函数、引用、默认参数、函数重载和函数模板。
(3)C++基于对象的编程--第6-8章:主要包括抽象数据类型、类、对象、封装、信息隐藏、成员访问控制、构造函数、析构函数、软件重用性、常量对象和成员函数、合成、友元、动态内存分配、static成员、this指针等等。
(4)C++面向对象编程--第9-15章,第19章和第21章:主要包括基类、单一继承、派生类、多重继承、虚拟函数、动态绑定、多态性、纯虚拟函数、抽象类、具体类、流输入/输出、类模板、异常处理、文件处理、数据结构、作为全功能对象的字符串、数据类型bool、强制类型转换操作符、名称空间、运行时类型信息(RTTI)、显式构造函数和mutable成员。
(5)C++泛型编程--第20章,是本书篇幅最长的一章;主要包括标准模板库(STL)、模板化容器、顺序容器、关联容器、容器适配器、用于遍历模板容器的迭代器以及用于处理模板化容器元素的算法等等。
从“Pascal和C”向“C++和Java”的进步
C++已经代替了C,成为软件业首选的系统实现语言。但C编程仍是一项重要而有价值的技能,因为还有大量的C遗留代码需要维护。H.M.Deitel博士在大学里已有20年教授编程入门课程的经验,他把教学重点放在如何设计思路清晰、结构良好的程序代码上。在这些课程中,他教得最多的便是编程的基本原理,强调控制结构和过程的有效运用。本书正是采用H.M.Deitel授课方式来撰写的。这样做有一定的局限性;但一旦碰到这些局限,我们会指出来,并解释有效处理方式。根据我们往常的经验,学生在使用本书的学习材料时,会遵循他们上Pascal语言课或C语言课时一样的规则。不过,这里却存在一点明显的差异:由于他们现在要学习的是一种时髦的编程语言(C++),并采用一种时髦的编程思维模式(面向对象编程),所以会极大激发他们的学习兴趣。因为他们一旦离开校园,就能学以致用。由于C++比Pascal或C难学得多,所以兴趣的培养至关重要。
我们的目标很明确:面向刚跨入编程领域的学生(具备较少或根本没有编程基础),编写一本C++编程教材,作为大学计算机入门编程课程。与此同时,不管在理论上还是在实践上,这本书又不乏传统的、高级的C++课程所要求的深度与严密性。为达到这个目的,我们编写了这本比其他C++教材更厚的书--因为书中详细地讲解了过程式编程、基于对象的编程、面向对象编程和泛型编程的原理。全世界已有成千上万的人在使用本书。
直到20世纪90年代初,计算机专业课的重点仍然是过程式编程,采用的语言是Pascal和C。但自那时起,这些课程便在很大程度上逐渐变成了强调面向对象的编程,采用的语言也变成了C++和Java。Deitel&Associates公司的重点是为当今流行的编程语言编写高质量的教学材料。本书付印之后,我们的工作重心将转移到《Java程序设计(第4版)》、《高级C++程序设计》和《高级Java程序设计》。
从第1章开始介绍面向对象
策划本书写作提纲时,我们面临着一个艰巨的挑战。本书应当采取一种纯粹的面向对象的教学方式,还是采取“过程式编程”和“面向对象编程”兼而有之的形式。
许多采用本书教学的老师都同时讲授过程式编程(C或Pascal)。C++本身并非一种纯粹的面向对象语言。相反,它是一种混合型语言,同时支持过程式和面向对象编程。
所以,我们选择了以下的方式。本书前5章介绍用C++进行过程式编程。它们揭示了计算机概念、控制结构、函数、数组、指针和字符串。这些章包括C++原样保留的C部分,以及C++在C基础上进行的“过程式编程改进”。
为使前5章独具特色,我们进行了一些工作。每章末尾都有一个特别的“对象思想”小节。这些小节讲解了面向对象的概念和术语,帮助学生熟悉对象是什么,以及它们有哪些行为。
第1章的“对象思想”一节讲解了面向对象的概念和术语。第2-5章的“对象思想”小节则提供了一个实际的面向对象系统项目的需求规范,目的是构建一个电梯模拟系统。同时,精心引导学生经历面向对象设计过程的每个典型阶段。这些小节讨论了如何标识问题中的对象,如何指定对象的属性行为,以及如何指定对象之间的交互。当学生学完5章的内容后,便完成了电梯模拟系统的所有面向对象设计,并准备好开始用C++来编写电梯模拟程序。第6章和第7章讲解了数据抽象和类。这两章也有“对象思想”小节,带领学生完成用C++编写这个电梯模拟程序的各个阶段。第9章的“对象思想”小节则将C++继承的概念应用于该程序。
本书简介
《C++编程金典(第3版)》提供了丰富的示例、习题和项目,它们选自多个不同的领域,为学生提供解决有趣的实际问题的机会。本书重点讲解了如何才能良好地开发一个软件工程,并强调了清晰与严谨的编程思路的重要性。我们在讲授一个程序实例时,尽量避免采用某些晦涩难懂的术语和语法规范。
本书由教育界的专家写成。他们大部分时间都致力于讲授和编写与流行编程语言有关的知识。
本书针对学习目标进行了精心的设计。例如,针对每一个新的C++或面向对象编程概念,都会用一个完整的、能实际运行的C++程序来阐述。同时还附有程序的实际输出结果。读者在看这些程序时,感觉和在一台计算机上自行输入和运行它们无异。我们把它叫做“活代码(Live-Code)方式”。
本书中,其他辅助教学方式还包括每章开头的学习目标;每章正文中穿插的和在每章结束时总结的一系列常见编程错误、良好编程习惯、性能提示、可移植性提示、软件工程知识和测试和调试提示;每章末尾都附有小结和术语;每章都提供了大量的自测题及答案;以及所有C++课本都具备的大量练习题。
练习题包括简单的复习题、较长的编程题以及大型项目等等。在第3~21章的练习题中,老师能找到许多合适的问题作为学期实习项目使用。为了教师和学生,我们精心编写了练习题。
写本书时,我们使用过各种各样的C++编译器,努力保证本书的程序适用于所有ANSI/IS0编译器。
本书内容以“Accredited Standards Committee X3,Information Technology”及其“Technical Committee X3J16,Programming Language C++”开发的C++编程语言为基础。该语言已获国际标准组织(ISO)批准。欲知详情,请寄信到:
X3 Secretariat
1250 Eye Street NW
Washington DC 20005
严谨的程序员应当仔细阅读这些文档。这些文档不是教程,但严格而精确地定义了C++和C,是编译器开发厂商和高级开发人员必备的参考读物。
我们已参照这些文档,仔细审阅了本书。由于本书属于入门级和中级课程,因此不打算讨论这些文档中提到的全部特性。
学习目标
每章开始都列有“学习目标”。其作用是介绍本章主题。而且在学完一章后,读者都应回过头去核查学习目标,看看自已是否已达到所有这些学习目标?这部分内容有助于树立读者的信心,并对后续的学习起到积极的促进作用。
268个示例程序和13741行代码,并附输出结果
我们用大量完整的、能实际运行的程序来讲解C++的各种特性;每个程序之后,都有一个窗口,其中包含了程序的运行结果--我们将这种方式称为“活代码方式”。采取这种做法,有助于学生查实程序是否按原先的设计要求运行。将输出结果同产生这些结果的程序语句联系起来,对于概念的学习与巩固,将起到令人意想不到的作用。在我们的示例程序中,将通过具体运用C++各种特性来进行练习。只要仔细阅读本书,便会发现它的效果其实非常类似于在一台计算机上敲入并运行这些程序。
469个插图/图表
本书包含众多插图和图表。第2章针对控制结构的讨论提供了精心绘制的流程图(注意:尽管书中并未将流程图作为一种程序开发工具正式介绍给大家,但在书中确实使用了一系列流程图,向读者指出C++控制结构的准确运作方式)。第15章则用线条图揭示了链接列表、队列、堆栈和二叉树的创建及维护。本书的其余部分也提供了其他形式的图。
625条编程提示
在本书中,我们采用6大设计元素帮助学生将重点放在程序开发、测试和调试以及性能和可移植性的各个重要方面。我们采用以下形式,强调了数百个类似的提示,包括:良好编程习惯、常见编程错误、性能提示、可移植性提示、软件工程知识以及测试和调试提示等。所有这些提示和编程习惯是我们60年(几个人加在一起)的编程及教学经验的结晶。最近,我们的一名学生(数学硕士)告诉我们,她感觉这些“提示”就像数学教科书中的那些公理、定理和推论一样,牢记这些东西,有助于构建出最出色的软件。
112条良好编程习惯
良好编程习惯将在正文中突出显示,目的是引导学生关注更好的编程技术。以前,我们向非程序员出身的人讲授入门级课程时,每堂课都在强调是“清晰性”。同时还指出,只要某种技术有助于写出结构更清晰、更易理解和更易维护的程序,便会对其重点介绍(本书中,则以“良好编程习惯”的形式表达出来)。
216条常见编程错误
学生们在学习一种语言时(特别是上第一门程序课时),经常会犯某些错误。把注意力放在这些“常见编程错误”上,有助于避免再犯同样的错误。此外,这样也可大大减少学生们心中的疑问。
87条性能提示
根据我们的经验,对于第一门程序课来说,教学生们写出清晰的、易于理解的程序仍然是迄今为止最首要的目标。然而,对年轻而又冲动的学生们来说,他们通常一开始便想编出速度奇快、占用资源最少以及敲击键盘次数最少的程序。事实上,他们最关心的是程序的“性能”。他们希望知道对自己的程序进行哪些调节之后,便可改善性能。尽管我们并不鼓励一开始便这样做,但由于确实有这方面的需求,所以本书仍然提供了一些“性能提示”,为部分学生提供改善程序性能的机会。
32条可移植性提示
软件开发是一个复杂而又成本极高的过程。开发软件的公司通常需要开发不同版本的软件,以适应不同计算机、不同操作系统的需要。因此,如今的软件开发项目无一例外地对可移植性提出了严格要求。换言之,一个软件应该只需少量修改(或者根本不用修改),便能在其他平台上运行。
146条软件工程知识
软件工程知识强调的是技术、结构以及设计等问题,均与软件工程有关。这些问题会大大影响软件系统的结构及构建机制(大型系统尤其如此)。这些知识往往会在以后学生们深造或正式工作时起到关键作用--一旦他们开始接触大型的、复杂的、现实世界的系统。
27条测试和调试提示
严格地说,这部分内容恐怕算不上什么“提示”。我们决定将“测试和调试提示”编入本书时,曾讨论过这些“提示”其实应该算是一种建议,测试程序可参照这些建议找出并消除程序中的Bug。事实上,大多数提示都是对C++功能与特性的一种“认识”,它们可从源头阻止Bug进入我们的程序。
小结
每章的最后一节是一个小结。目的是想帮助学生们复习和巩固一些关键概念。平均每章有37条小结。
术语
术语部分将按字母顺序,列出各章出现的重要技术词汇,有助于帮助学生进一步巩固各章介绍的知识。
提示、编程习惯和错误一览
我们列举当前章出现的所有良好编程习惯、常见编程错误、性能提示、可移植性提示、软件工程知识以及测试和调试提示。
554个自测题及答案
所有自测题和答案均针对自学而精心设计。学习这部分内容,学生有机会建立起深入学习的信心,并进一步巩固所学知识。完成这些自测题之后,参加正式考试时也会胸有成竹:
877个练习题(此为分类合并后的数据;共计1431个练习题)
在每一章最后,我们提供了一系列练习题,目的是帮助大家回忆重要的术语和概念、编写独立的C++语句、编写少数C++函数和类、编写完整的C++函数类/程序以及编写重大的学期实习项目等等。根据这些练习题,教师可对自己的课程进行调整,以适应不同层次学生的需要。同时,每学期也可以相应地改变授课计划。以这些练习题为基础,教师可以灵活地、有针对性地安排家庭作业、随堂考以及大型测验。
550页“教师手册”,附练习题答案
练习题的解决方案放在"教师手册"光盘上,并只可由教师向Prentice Hall出版社索取(注意,不要向我们写信索取教师手册。只有将本书作为教材使用的大学教师才有权获得。符合这一条件的读者,可向Prentice Hall的销售代表索取)。