moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:3459回复:5

C++ 大学教程

楼主#
更多 发布于:2002-08-03 21:22
内容简介  
 
   本书是一本C++编程方面的优秀教程,全面介绍了过程式编程与面向对象编程的原理方法,细致地分析了各种性能问题,移植性问题和可能出错的地方,介绍了如何提高软件工程质量,详细讨论了新的ANSI C++标准和标准板库,并提供丰富的自测练习和习题.可以说本书是最好的学习C++语言的教程之一,是学习C++编程的\"宝典\".本书所配的\"多媒体教室\"光盘更具有特色,通过交互环境,使学习过程更加生动有趣.本书是高等院校进行编程语言和C++教学的教材,是软件设计人员进行C++程序开发的宝贵参考资料,是一本值得珍藏好书.  第1章  计算机与C++编程简介
    1.1  简介
    1.2  什么是计算机
    1.3  计算机组成
    1.4  操作系统的变革
    I.5  个人计算、分布式计算与客户/a匠务器计算
    l. 6  机器语言、汇编语言和高级语言
    1.7  C语言与C++的历史
    1.8  C++标准库
    1.9  Java、Internet与万维网
    1.10  其他高级语言
    1.11  结构化编程
    1.12  典型C++环境基础
    1.13  C++与本书的一般说明
    1.14  C++编程简介
    1.15  简单程序:打印一行文本
    1.16  简单程序:两个整数相加
    1.17  内存的概念
    1.18  算术运算
    1.19  判断:相等与关系运算符
    1.20  新型头文件与名字空间
    1.21  有关对象的思考
    小结
    术语
    自测练习
    自测练习答案
    练习
  第2章  控制结构
    2.1  简介
    2.2  算法
    2.3  伪代码
    2.4  控制结构
    2.5  if选择结构
    2.6  if/e1se选择结构
    2.7  while重复结构
    2.8  构造算法:实例研究1(计数器控制重复)
    2.9  构造算法与自上而下逐步完善:实例研究2(标记控制重复)
    2.10  构造算法与自上而下逐步完善:实例研究3(嵌套控制结构)
    2.11  赋值运算符
    2.12  自增和自减运算符
    2.13  计数器控制循环的要点
    2.14  for重复结构
    2.15  for结构使用举例
    2.16  switch多项选择结构
    2.17  do/while重复结构
    2.18  break和continue语句
    2.19  逻辑运算符
    2.20  混淆相等(.==)与赋值(=)运算符
    2.21  结构化编程小结
    2.22  有关对象的思考:确定问题中的对象
    小结
    术语
    自测练习
    自测练习答案
    练习
  第3章  函数
    3.1  简介
    3.2  C++程序组件
    3.3  数学函数库
    3.4  函数
    3.5  函数定义
    3.6  函数原型
    3.7  头文件
    3.8  随机数产生器
    3.9  案例:机会游戏与enum简介
    3.10  存储类
    3.11  作用域规则
    3.12  递归
    3.13  使用递归举例:Fibonacci数列
    3.14  递归与迭代
    3.15  带空参数表的函数
    3.16  内联函数
    3.17  引用与引用参数
    3.18  默认参数
    3.19  一元作用域运算符
    3.20  函数重载
    3.21  函数模板
    3.22  有关对象的思考:确定对象属性
    小结
    术语
    自测练习
    自测练习答案
    练习
  第4章  数组
    4.1  简介
    4.2  数组
    4.3  声明数组
    4.4  使用数组的举例
    4.5  将数组传递给函数
    4.6  排序数组
    4.7  实例研究:用数组计算平均值、中数和模
    4.8  查找数组:线性查找与折半查找
    4.9  多下标数组
    4.10  有关对象的思考:确定类的行为
    小结
    术语
    自测练习
    自测练习答案
    练习
    递归练习
  第5章  指针与字符串
    5.1  简介
    5.2  指针变量的声明与初始化
    5.3  指针运算符
    5.4  按引用调用函数
    5.5  指针与常量限定符
    5.6  按引用调用的冒泡排序
    5.7  指针表达式与指针算法
    5.8  指针与数组的关系
    5.9  指针数组
    5.10  实例研究:洗牌与发牌
    5.11  函数指针
    5.12  字符与字符串处理简介
    5.12.1  字符与字符串基础
    5.12.2  字符串处理库的字符串操作函数
    5.13  有关对象的思考:对象间的交互
    小结
    术语
    自测练习
    自测练习答案
    练习
    特殊小节:建立自己的计算机
    更多的指针练习
    字符串操作练习
    特殊小节:高级字符串操作练习
    复杂字符串操作练习
  第6章  类与数据抽象(一)
    6.1  简介
    6.2  结构定义
    6.3  访问结构成员
    6.4  用struct实现用户自定义类型Time
    6.5  用类实现Time抽象数据类型
    6.6  类范围与访问类成员
    6.7  接口与实现方法的分离
    6.8  控制对成员的访问
    6.9  访问函数与工具函数
    6.10  初始化类对象:构造函数
    6.11  在构造函数中使用默认参数
    6.12  使用析构函数
    6.13  何时调用构造函数与析构函数
    6.14  使用数据成员和成员函数
    6.15  微妙的陷阱:返回对Private数据成员的引用
    6.16  通过默认的成员复制进行赋值
    6.17  软件复用性
    6.18  有关对象的思考:编写电梯模拟程序的类
    小结
    术语
    自测练习
    自测练习答案
    练习
  第7章  类与数据抽象(二)
    7. 1  简介
    7.2  const(常量)对象与const成员函数
    7.3  复合:把对象作为类成员
    7.4  友元函数与友元类
    7.5  使用this指针
    7.6  动态内存分配与new和delete运算符
    7.7  static类成员
    7.8  数据抽象与信息隐藏
    7.8.1  范例:数组抽象数据类型
    7.8.2  范例:字符串抽象数据类型
    7.8.3  范例:队列抽象数据类型
    7.9  容器类与迭代
    7.10  代理类
    7.11  有关对象的思考:在电梯模拟程序中使用复合和动态对象管理
    小结
    术语
    自测练习
    自测练习答案
    练习
  第8章  运算符重载
    8.1  简介
    8.2  运算符重载的基础
    8.3  运算符重载的限制
    8.4  用作类成员与友元函数的运算符函数
    8.5  重载流插入与流读取运算符
    8.6  重载一元运算符
    8.7  重载二元运算符
    8.8  实例研究:Array类
    8.9  类型之间的转换
    8.10  实例研究:String类
    8.11  重载十十与――
    8.12  实例研究:Date类
    小结
    术语
    自测练习
    自测练习答案
    练习
  第9章  继承
    9.1  简介
    9.2  继承:基类和派生类
    9.3  Protected成员
    9.4  把基类指针强制转换为派生类指针
    9.5  使用成员函数
    9.6  在派生类中重定义基类成员
    9.7  Public、Protected和Private继承
    9.8  直接基类和间接基类
    9.9  在派生类中使用构造函数和析构函数
    9.10  将派生类对象隐式转换为基类对象
    9.11  关于继承的软件工程
    9.12  复合与继承的比较
    9.13  对象的“使用”关系和“知道”关系
    9.14  实例研究:类Point、CircIe和Cylinder
    9.15  多重继承
    小结
    术语
    自测练习
    自测练习答案
    练习
  第10章  虚函数和多态性
    10.1  简介
    10.2  类型域和switch语句
    10.3  虚函数
    10.4  抽象基类和具体类
    10.5  多态性
    10.6  实例研究:利用多态性的工资单系统
    10.7  新类和动态关联
    10.8  虚析构函数
    10.9  实例研究:继承接口和实现
    10.10  多态、虚函数和动态关联
    小结
    术语
    自测练习
    自测练习答案
    练习
  第11章  C++输入/输出流
    11.1  简介
    11.2  流
    11.2.1  iosbeam类库的头文件
    11.2.2  输入/输出流类和对象
    11.3  输出流
    11.3.1  流插入运算符
    11.3. 2  连续使用流插入/流读取运算符
    11.3.3  输出char类型的变量
    11.3.4  用成员函数put输出字符和put函数的连续调用
    11.4  输入流
    11.4.1  流读取运算符
    11.4.2  成员函数get和getline
    11.4.3  istream类中的其他成员函数(Peek、Putback和ignore)
    11.4.4  类型安全的I/0
    11.5  成员函数read、gcount和write的无格式输人/输出
    11.6  流操纵算子
    11.6.1  整数流的基数:流操纵算子dec、oct、hex和setbase
    11.6.2  设置浮点数精度(Precision、setprecision)
    11.6.3  设置域宽(setw、width)
    11.6.4  用户自定义的流操纵算子
    11.7  流格式状态
    11.7.1  格式状态标志
    11.7.2  尾数零和十进制小数点(ios:showpoint)
    11.7.3  对齐(ios::left、ios::right、ios::internal)
    11.7.4  设置填充字符(fill、setfill)
    11.7.5  整数流的基数:(ios::dec、ios::oct、ios::hex、ios::showbase)
    11. 7.6  浮点数和科学记数法(ios::scientific、ios::fixed)
    11.7.7  大/小写控制(ios:uppercase)
    11.7.8  设置及清除格式标志(flags、setiosflags、resetiosflags)
    11.8  流错误状态
    11.9  把输出流连到输入流上
    小结
    术语
    自测练习
    自测练习答案
    练习
  第12章  模板
    12.1  简介
    12.2  函数模板
    12.3  重载模板函数
    12.4  类模板
    12.5  类模板与非类型参数
    12.6  模板与继承
    12.7  模板与友元
    12.8  模板与static成员
    小结
    术语
    自测练习
    自测练习答案
    练习
  第13章  异常处理
    13.1  简介
    13.2  何时使用异常处理
    13.3  其他错误处理方法
    13.4  C十十异常处理基础:try、throw、catch
    13.5  简单异常处理例子:除数为o
    13.6  抛出异常
    13.7  捕获异常
    13.8  再抛出异常
    13.9  异常指定
    13.10  处理意外异常
    13.11  堆栈解退
    13.12  构造函数、析构函数与异常处理
    13.13  异常与继承
    13.14  处理new故障
    13.15  auto_ptr类与动态内存分配
    13.16  标准库异常层次
    小结
    术语
    自测练习
    自测练习答案
    练习
  第14章  文件处理
    14.1  简介
    14.2  数据的层次
    14.3  文件和流
    14.4  建立顺序访问文件
    14.5  读取顺序访问文件中的数据
    14.6  更新顺序访问文件
    14.7  随机访问文件
    14.8  建立随机访问文件
    14.9  向随机访问文件中随机地写入数据
    14.10  从随机访问文件中顺序地读取数据
    14.11  实例研究:事务处理程序
    14.12  对象的输入/输出
    小结
    术语
    自测练习
    自测练习答案
    练习
  第15章  数据结构
    15.1  简介
    15.2  自引用类
    15.3  动态内存分配
    15.4  链表
    15.5  堆栈
    15.6  队列
    15.7  树
    小结
    术语
    自测练习
    自测练习答案
    练习
    特殊小节:建立自己的编译器
  第16章  位、字符、字符串和结构
    16.1  简介
    16.2  结构的定义
    16.3  结构的初始化
    16.4  函数和结构
    16.5  类型定义:typedef
    16. 6  范例:高效的洗牌和发牌模拟程序
    16.7  位运算符
    16.8  位段
    16.9  字符处理库
    16.10  字符串转换函数
    16.11  字符串处理库中的查找函数
    16.12  字符串处理库中的内存函数
    16.13  字符串处理库中的其他函数
    小结
    术语
    自测练习
    自测练习答案
    练习
  第17章  预处理器
    17.1  简介
    17.2  预处理指令#include
    17.3  预处理指令#define:符号常量
    17.4  预处理指令#define:宏
    17.5  条件编译
    17.6  预处理指令#error和#pragma
    17.7  运算符#和##
    17.8  行号
    17.9  预定义的符号常量
    17.10  断言(宏assert)
    小结
    术语
    自测练习
    自测练习答案
    练习
  第18章  C语言遗留代码问题
    18.1  简介
    18.2  UNIX和DOS系统中的输入/输出重定向
    18.3  变长参数表
    18.4  使用命令行参数
    18.5  对编译多个源文件程序的说明
    18. 6  用edt和atexit终止程序的执行
    18.7  volatile类型限定符
    18.8  整数和浮点数常量的后缀
    18.9  信号处理
    18.10  动态内存分配:函数calloc和realloc
    18.11  无条件转移:goto语句
    18.12  联合体
    18.13  连接指定
    小结
    术语
    自测练习
    自测练习答案
    练习
  第19章  string类与字符串流处理
    19.1  简介
    19.2  string的赋值与连接
    19.3  比较string
    19.4  子串
    19.5  交换string
    19.6  string的特性
    19.7  寻找string中的字符
    19.8  替换string中的字符
    19.9  在string中插入字符
    19.10  转换成C语言式char 字符串
    19.11  迭代器
    19.12  字符串流处理
    小结
    术语
    自测练习
    自测练习答案
    练习
  第20章  标准模板库(STL)
    20.1  标准模板库(STL)简介
    20.1.1  容器简介
    20.1.2  迭代器简介
    20.1.3  算法简介
    20.2  顺序容器
    20.2.1  vector顺序容器
    20.2.2  1ist顺序容器
    20.2.3  deque顺序容器
    20.3  关联容器
    20.3.1  multiset关联容器
    20. 3.2  set关联容器
    20.3.3  mdtimap关联容器
    20.3.4  map关联容器
    20.4  容器适配器
    20.4.1  stack适配器
    20.4.2  queue适配器
    20.4.3  Priority_queue适配器
    20.5  算法
    20.5.1  fill、fill_n、generate与generate_n
    20.5.2  equal、mismatch和1exicographical_compare
    20.5.3  remove、remove_if、 remove_copy和remove_copy_if
    20.5.4  replace、replace_if、replace_copy和replace_copy_if
    20.5.5  数学算法
    20.5.6  基本查找与排序算法
    20.5.7  swap、iter_swap和swap_ranges
    20.5.8  copy―backward、  merge、  unique和reverse
    20.5.9  inplace_merge、  unique―copy和reverse―copy
    20.5.10  集合操作
    20.5.11  1ower―bound、  upper―bound和equal_range
    20.5.12  堆排序
    20.5.13  min和max
    20.5.14  本章未介绍的算法
    20.6  bitset类
    20.7  函数对象
    小结
    术语
    自测练习
    自测练习答案
    练习
    Internet和World Wide Web中的STL资源
    STL文献
  第21章  ANSI/ISO C++标准语言补充
    21.1  简介
    21.2  bool数据类型
    21.3  static―cast运算符
    21.4  const―cast运算符
    21.5  reinterpret―cast运算符
    21.6  名字空间
    21.7  运行时类型信息(RTTI)
    21.8  运算符关键字
    21.9  explicit构造函数
    21.10  mutable类成员
    21.11  类成员指针(.和―>)
    21.12  多重继承与virtual基类
    21.13  结束语
    小结
    术语
    自测练习
    自测练习答案
    练习
  附录A  运算符的优先级与结台律
  附录B  ASCII字符集
  附录C  数值系统
  附录D  有关C++的Internet与Web资源
  参考文献

最新喜欢:

okincnokincn
按第一贴的“给分”键,给分。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-03 21:24
【作译者】 邱仲潘等译
【著者】 美Harvey M.Deitel
【书号】 5053-6727-7/TP.3759
【出版日期】 2001-07  
【书代号】 TP67270  
【所属类别】 国外计算机科学教材系列
 【印张】 53.3
【字数千】 1363
【页数】 815
【开本】 16开
【版次】 1-1  
序言/前言
 欢迎使用ANSI/ISO Draft Standard C++语言。本书是由一老一少写成的。老者(HMD,1967年毕业于麻省理工学院)有着36年的编程和教学经验,少者(PJD,1991年毕业于麻省理工学院)有15年的编程经验,并有着丰富的教学与写作经历。老者经验丰富,少者精力充沛。老者追求清晰,少者追求性能。老者喜欢优雅与美观,少者喜欢快速得到结果。一老一少的合作,使本书的信息更丰富、内容更有趣。
    这是C++编程者应当高兴和兴奋的时刻,ANSI/ISO C++草案标准即将正式应用。ANSI(American  National Standards Institute,美国国家标准委员会)和ISO(International Standards Organization,国际标准化组织)合作开发了这个标准的草案,它即将成为计算机界最重要的全球性标准。
    当我们编写《C++大学教程》第一版时,我们的目标是为高等学校学生编写一本教材,当时的学生主要学习Pascal和C语言,强调“过程式”编程模式。向计算机科学专业一年级和二年级学生提供一本C++教程并不容易,我们必须同时介绍两种编程模式,即过程式编程(因为C++仍然包括C语言)和面向对象编程,因此就要在入门介绍中提供两方面的材料。我们在本书的前五章介绍原始数据类型、控制结构、函数、数组、指针和字符串等C语言知识,而在第6章到第15章介绍面向对象编程。
    《C++大学教程》的第一版已成为世界上使用最普及的大学C++教材。而该书的第二版推迟编写的原因有两个:
    1.这段时间C++正在活跃地发展,新的草案标准文档不断推出,而短期内标准委员会没有接受草案标准的明显迹像。估计还要一年左右标准委员会才能在全球范围内接受当前草案标准。
    2.我们等待着C++大学教程再版的合适时机。1997年7月,Bjarne Stroustrup推出了《The C++  Programming Language》第三版,Bjarne Sboustup是C++的创始人,他的书是C++语言的权威著作。这时我们认为C++的新定义已经相当稳定,可以推出C++大学教程的第二版。
    有一段时间,我们把精力转向推出5本Java方面的书籍:《Java How to Program》第一版与第二 版,Windows 95/NT和Solaris平台上的交互式学习软件包《Java Multimedia Cyber C1assroom》第一版与第二版,以及《Java How to Program with an Introduction to Visual J++》第一版(由Microsoft公司资助)。但ANSI/ISO C++草案标准的即将推出又使我们把精力转向c++。
   《C++大学教程》第二版
    下面想谈谈本书的创作过程。Prentice Hall公司的计算机图书编辑Laura Steele邀请了28位评审人,包括ANSI/ISO C++委员会主席和几位要员,他们中有十几位参加了本书第一版审校并提出了改进建议,特别是设法使本书与ANSI/ISO C++草案标准的演变同步。在此过程中,总共产生了一千多页的审稿材料。然后我们根据ANSI/ISO C++草案标准中增加的部分,修改并编写了新内容。我们编写了代码实例,运行程序以捕获其屏幕输出,并编写了相应的编程步骤。这些内容分布在第一版本的18个章节中。然后我们编写了另外三章:第19章“string类与字符串流处理”,第20章“标准模板库(STL)”,第21章“ANSI/ISO C++标准语言补充”。这些章节已经过专家们审读,而且我们认真采纳了他们的建议。例如关于STL一章,ANSI/ISO C++委员会的多位会员已审阅过该章,并请STL的创建者Alexander Stepanov和Meng Lee进行了一些修改。到本书编写时,C++还在变化之中,只有很少的编辑器能够完全赶上ANSI/ISO C++新标准的速度。在使用C++当前版本与草案标准的C++新特性之间,我们经过了反复地推敲。
    软件开发的革命
    几年来计算机硬件大大改进,而软件则因为某种原因好像拒绝追求“更快更好”。如今我们正处于软件开发的变革之中,这种变革基于常识、硬件标准化、组件交换性等Henry Ford在Model T Ford时代采用的思想。这种软件组件称为“对象”或“类”,是产生对象的“模具”。
    最早成熟的面向对象语言是Smalltalk,1970年初由Xerox公司的Palo Alto研究中心开发。但最广泛使用的面向对象语言却是C++语言,后者是20世纪80年代初由AT&T的Bjarne Stroustrup等人开发的。在本书第一版和第二版之间,出现了另一个重要的面向对象语言,即Java语言,是20世纪90年代初由Sun系统公司的James Gosling等人开发的。
    为什么每10年便会推出一种新的面向对象语言呢?Smalltalk4F常超前,是个试验性产品。C++正逢其时,适合今天的高性能系统编辑和应用程序开发需求。Java则提供了建立可移植性、多媒体支持和基于Internet/Word Wide Web的网络应用。
    过程式编程、基于对象编程、面向对象编程与常规编程
    本书要介绍C++的五大组件和目前的四种编程机制(下面分五点介绍)。
    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章,主要课题包括基类、单一继承、派生类、多重继承、虚函数、动态关联、多态、纯虚函数、抽象类、具体类、流输人/输出、类模板、异常处理、文件处理、数据结构、字符串作为成熟对象、boo1数据类型、强制类型转换运算符、名字空间、运行时类型信息(RTTI)、explicit构造函数和mutable成员。
    5.C++常规编程――第20章,也是本书内容最多的一章,主要课题包括标准模板库(STL)、模板化容器、顺序容器、关联容器、容器适配器、遍历模板化容器的迭代器和处理模板化容器元素的算法。
    Pascal与C语言向C++的演变
    C++已经代替了C语言,成为计算机行业系统实现的首选语言。但C语言编程依然很重要,是今后十年的重要技术,因为还有许多C语言遗留代码需要维护。Harvey M.Deitel博士二十年来在高等学校从事编程导论课程教学,一直要求编写结构合理、简洁流畅的程序。这些课程中主要介绍基本编程原理,强调有效使用控制结构和功能化。我们按照HMD的教学方法提供这些材料。有一些容易出错的地方,我们会及时指出,并说明如何避免。根据我们的经验,学生掌握C++的方式与掌握Pascal和C语言导论课程的方式差不多,但有一个重要区别,那就是学生们兴趣更大,他们知道自己是在学习一流的语言(C++)和一流的编程机制(面向对象编程),而且大学毕业后马上就能使用这种语言:学生的学习热情将会增加,这一点是非常重要的,因为C++要比Pascal和C语言难得多。
    我们的目标很明确:编写一本大学计算机专业的C++编程教科书,让还没有任何编程经验的学生掌握理论和实践方面要求都很高的C++语言。为了达到这个目的,本书比其他C++书籍都要厚,我们不仅介绍C++,还要耐心介绍过程式编程、基于对象编程、面向对象编程和常规编程的原理。全世界已经有成千上万的大学生和专业研讨班学员使用这本教材。
    从第1章就开始介绍面向对象编程
    本书的结构曾让我们费尽思量,是介绍单纯的面向对象编程方法,还是介绍平衡过程式编程与面向对象编程的混合方法?
    许多使用这本教材的老师都曾经进行过程式编程(Pascal或C语言)的教学,而C++本身也不是单纯的面向对象式语言,而是同时支持过程式编程与面向对象编程。
    因此,我们选择下面的方法。本书前五章介绍C++过程式编程,讨论计算机概念、控制结构、函数、数组、指针和字符串。这些内容介绍C++中的C语言组件和C++对C语言的“过程性改进”。
    我们通过某种方法使这五章更有特色。每一章的末尾都有一个特殊小节“有关对象的思考”,这些小节介绍面向对象的术语和概念,帮助学生熟悉对象的内容和行为。
    第1章的“有关对象的思考”介绍面向对象的术语和概念。第2章到第5章的“有关对象的思考”介绍真正的面向对象系统项目的要求,通过建立一个电梯模拟程序帮助学习了解面向对象设计过程的典型阶段:这些小节介绍如何确定问题中的对象,如何指定对象的属性与行为,如何指定对象之间的交互。学完第5章后,学生就可以完成电梯模拟程序的面向对象设计过程,使用C++编写电梯模拟程序。第6章和第7章介绍数据抽象与类,其中“有关对象的思考”介绍了用c++编写电梯模拟程序的各个阶段。
    关于《C++大学教程》
    《C++大学教程》一书包含了大量的可应用在各个领域中的程序实例、练习和项目,使学生可以解决各种有趣的实际问题。本书注重良好的软件工程原则并强调程序的清晰性。我们避开繁琐的语法和术语,并设法通过例子进行教学。
    本书是由两位教育工作者编写的,这两位都在用大部分时间从事一流实用编程语言的教学工作和教材的创作。
    本书的内容特别注重教学方法。例如,几乎每个文中解释的c++或面向对象编程的新概念都用C++程序实现,并立即用一个窗口显示程序输出。阅读这些程序就像亲临计算机前输人和运行程序一样,我们称其为“有生命力的代码”。
    文中的教学工具包括每章开头的“教学目标”,贯穿全文的“常见编程错误”、“编程技巧”、“性能提示”、“可移植性提示”、“软件工程视点”和“测试与调试提示”;每章以项目符号列表形式进行“小结”,按字母顺序列出“术语”;每章有“自测练习与答案”,并有丰富的“练习”。
    练习包括简单复习题、较长的编程问题到大项目。教师可以从第3章到第21章找到许多相关的问题作为项目练习。我们花了大量精力来设计这部分练习,使本书对学生更有价值。
    编写本书时,我们使用了Sun SPARC工作站和IBM PC兼容机的各种C++编译器(Borland C++ Builder、Microsoft Visual C++  5.0和Metrowerks Code Warrior Professional)。这些程序通常不需要修改或只稍作修改即可在所有这些编译器中运行。我们的程序基于Microsoft Visual C++进行开发(少数例外已在文中注明)。
    本书采用的C++编程语言按照“信息系统国际标准草案工作稿――C++编程语言”(Working Paper for Draft Proposed International Standard for Information Systems――Propamming Language C++)中的定义。这个标准的批准和技术开发工作分别由认证标准委员会x3、信息技术及其技术委员会X3J16(C++编程语言)进行的。想获得详细信息请写信到下列地址:
    X3 Secretariat
    1250 Eve Street NW
    Washington DC 20005
    本书根据编程语言的美国国家标准(American National Standard for Programming Languages)――
    C:ANSI/ISO 9899―1990(Copyright 1990 by International Organization for Standardization)定义的C++编程语言编写,该标准的副本可以直接从下列地址购买:The American National Stands Institute,11 West 42nd Street,New York,NY l0036,电话:(212)642―4900,传真:(212)398―0023,http://www.ansi.org。
    真正的程序员应该认真阅读这些文献并经常参考。这些文献不是教程,而是相当精确地定义了C++和C语言,满足编译器实现者和开发人员的需要。我们认真对照了这些文献,本书是初中级教程,不可能介绍这些综合性文献中的每个特性。
    教学目标
    每章开头的“教学目标”介绍该章的学习目标,告诉学生要学什么,让学生学完该章后可以判断自已是否达到了这个目标,帮助学生建立信心并使学习成果得到巩固。
    每章分成若干个小节,解决各个关键领域。我们喜欢分成许多小节。
    248个实例程序,10660行代码(带程序输出)
    C++的特性是在完整、可运行的C++程序中提供的。每个程序后面是一个窗口,包括程序运行的输出。这样使得学生可以确定程序如期运行。将输出与程序语句相联系是学习和巩固新概念的好方法。我们的程序使用各种C++特性,认真阅读本书就像亲临计算机前面输人并运行这些程序一样。
    152个演示/图形
    书中包括大量演示插图。第3章介绍控制结构时提供了经过认真绘制的流程图(注意:我们不想把流程图作为程序的开发工具,但可以通过流程图表示c44控制结构的精确操作)。第15章“数据结构”用线图演示链表、队列、堆栈和二叉树的生成与维护。书中还有其他大量的程序演示。
    621个编程提示
    我们用六个设计要素帮助学生注意程序开发、测试与调试、性能和移植性等重要方面。我们用“常见编程错误”、“编程技巧”、“性能提示”、“可移植性提示”、“软件工程视点”和“测试与调试提示”等形式列举了几百个提示。这些提示和实践总结了我们五十多年的编程和教学经验。最近,一位数学系的学生告诉我们,她觉得这些方法有点像数学教材中强调公理、定理和推论,提供了建立良好的软件工程的基础。
    115个编程技巧
    书中强调了编程技巧,要求学生注意掌握建立良好程序的习惯。向非编程人员讲课时,我们介绍编程的一个原则就是“清晰性”。我们告诉学生将在这些编程技巧中强调使程序更清晰、更易懂、和更易于维护的技术。
    201个常见编程错误
    学生学习语言时(特别是在第一门编程课程中)经常容易犯这样那样的错误。让学生注意这些“常见编程错误”有助于避免这些编程错误,还可以减少老师的答疑工作量。有些错误不是那么常见,但我们不想再加一类提示,因此也放在“常见编程错误”中。
    88个性能提示
    根据我们的经验,让学生学会编写清晰易懂的程序是第一门编程课程最重要的目标。但学生可能想编写运行最快、使用内存最少、要求键击数最少或具有各种其他用途的程序。学生真正关心的是性能,希望为他们的程序快马加鞭。因此我们通过“性能提示”强调改进程序性能的方法。  
    35个可移植性提示
    软件开发是复杂而昂贵的活动:各种软件公司要经常开发对各种计算机和操作系统定制的版本,因此我们特别强调可移植性的问题,即产生的软件不做改变或稍做改变即可在各种不同的计算:
    机系统中运行:许多人认为C++是最适合开发可移植软件的语言,特别是C++与ANSI/ISOC密切相关,ANSI/ISOC++草案标准又即将作为全球C++标准而被批准。有人认为,只要用C++编写实;用程序,这个应用程序自然就是可移植的。其实不然,要实现可移植性,就要求认真细致的设计,需要避开许多陷阱:我们用“可移植性提示”帮助学生开发可移植的软件。    
    147个软件工程视点
    面向对象编程机制要求彻底重新考虑如何建立软件系统。C++是实现良好软件工程的有效语言。“软件工程视点”强调影响软件系统结构和构造(特别是大型系统)的技术、结构问题和设计问题。学生在这里学习的东西对高级课程和今后工作中建立大型、复杂的实际系统非常有用。
    26个测试和调试提示
    “测试和调试提示”应该介绍测试程序缺陷和删除程序缺陷的建议,但书中大多数测试和调试提示实际上是关于防止缺陷进入程序的C++功能和特性。
    小结
    每章最后有一些其他教学材料,包括丰富的项目符号列表形式的小结,帮助学生复习和巩固自学的关键概念。平均每章有38个小结子项。
    术语
    术语部分按字母顺序定义正文中遇到的术语,以便再次确认这些基本概念。平均每章有66个术语。
    559个自测练习与答案(包括各个部分)
    大量“自测练习”和“自测练习答案”有助于自学,使学生可以建立信心,准备进行通常的练习。
    862个练习(包括各个部分,总共1421个练习)
    每章最后有大量练习,包括简单概念和术语复习,编写各种C++语句,编写小部分C++函数和类,编写完整C++函数、类与程序,以及编写大型项目。大量练习使教师可以根据学生的具体需要调整课程,每个学期指定不同课题。教师可以利用这些练习布置家庭作业、进行小测验和大型考试。
    500页的《教师手册》和练习答案
    《教师手册》(Prentice Hall专门为教师编写的非销售用书)含有练习答案,并放在光盘中,只有教师才能通过Prentice Hall代表从Prentice Hall公司获得(说明:请不要来信购买《教师手册》,《教师手册》只能提供给教这门课的大学教授。教师只能从Prentice Hall代表那里得到解答手册)。
    本书所附的光盘中有书中大约一半练习的答案。
    本书的快速浏览
    本书分为几个部分。第一部分是第1章到第5章,详细介绍C++过程式编程,包括数据类型、输入/输出、控制结构、函数、数组、指针和字符串。
    第二部分是第6章到第8章,详细介绍数据抽象与类、对象和运算符重载。本部分也可以称为“对象编程”。
    第三部分是第9章到第10章,介绍继承、虚函数和多态,是真正面向对象编程的根本技术。
    第四部分是第11章到第14章,介绍C++和面向流的输入/输出,包括流I/0与键盘、屏幕、文件和字符数组,并讨论顺序文件访问和直接访问(即随机访问)文件处理。
    第五部分是第12章和第13章,介绍C++中两个最新的补充,即模板和异常处理。模板也称为参数化类型,可以促进软件的复用性。异常处理功能帮助程序员开发更健壮、更具容错性、面向业务或任务的系统。
    第六部分,即第15章,详细介绍链表、队列、堆栈、树等动态数据结构。本章加上第20章介绍的标准模板库可以生成丰富的数据结构,这些结构是c++对传统计算机科学数据结构和算法课程的重要补充。
    第七部分是第16章到第18章,介绍位、字符与字符串操作,预处理器和其他各种课题。
    第八部分是第19章到第21章,介绍C++最新改进和ANSI/IS0 C++草案标准中包括的c++标准库。包括介绍string类、字符串流处理、标准模板库(STL)和C++的其他最新改进。
    本书最后的参考资料提供正文的附录,包括运算符优先级、ASCII字符集、数值系统(二进制、十进制、八进制和十六进制数)和有关C++的Internet/World Wide Web资源,并提供大量参考文献,帮助读者进一步钻研。下面详细介绍每章内容。
    第1章“计算机与C++编程简介”,介绍计算机是什么、如何工作、如何编程,介绍结构化编程的概念以及这些技术如何促进程序编写方式的变革。本章简要介绍了编程语言的发展历史,从机器语言、汇编语言到高级语言,讨论C++编程语言的起源。本章还将介绍典型的C++编程环境,简要介绍了如何编写C++程序,并详细介绍了C++中判断与算术操作的处理过程。学习本章之后,学生可以了解如何编写简单而完整的C++程序。我们将介绍万维网与Java编程语言的出现及其所导致Internet的突飞猛进。我们讨论namespace和using语句,解释符合草案标准编译器的优点。我们继续在本版书的前几章中使用“旧式”头文件,而在后面出现大量新的C++材料时则使用新式头文件。旧式编译器仍在广泛使用,几年之后才会完全退出历史舞台。读者如果想尽快进入面向对象的世界,可以看看每章“有关对象的思考”一节中关于对象技术的介绍。
    第2章“控制结构”,介绍解决问题的算法(过程)概念,并解释在产生程序时如何有效利用控制结构使程序更易懂、更好调试、更易于维护,争取编译程序的一次性成功。本章介绍了顺序结构、选择结构(if、if/e1se和switch)和重复结构(while、do/while和for),详细讨论了重复,并比较了计数器控制循环和标记控制循环介绍了产生结构合理的程序所需要的自上而下、逐步完善的方法,并介绍了常用的程序设计辅助伪代码:第2章使用的方法适用于任何编程语言中有效地使用控制结构,而不是只适用于C++。本章帮助学生养成良好的编程习惯,以准备在本书后面处理更复杂
    的编程任务。本章最后介绍逻辑运算符&&、II和!。关键字表中增加了新的关键字,引入了新型的static_cast运算符,比从C语言继承的旧式C++强制类型转换功能更安全。我们增加了“PeterMinuit”练习,让学生看到通过计算机程序计算复利的特点。我们对C++源程序引入了更开放、更易读的“感观”效果G我们调整了模拟电梯的程序实例、根据读者反映,这个实例能够很好地把一些概念联系起来。我们对比r循环中的循环计数器增加了新的范围规则。
    第3章“函数”,介绍程序模块的设计与构造。C++中与函数相关的功能包括标准库函数、程序员定义的函数、递归、按值调用与按引用调用。第3章介绍的技术是建立结构合理的程序的关键,特别是对于系统程序员和应用程序程序员在实际应用中可能开发的大型程序和软件,这些技术更为重要。“分而治之,各个击破”的战略是解决复杂问题的有效方法,将问题分解为更简单的交互组件。学生对随机数和模拟器很感兴趣,他们很喜欢投段子游戏,因为该游戏能很好地利用控制结构。
    本章介绍了递归技术,用一个表格总结了本书的几十个递归例子与练习。有些教材把递归放在后面讲,但我们认为这个课题应在讲课时由浅入深慢慢介绍。本章结束处的60个练习中包括几个经典的递归问题,如汉诺塔问题。本章介绍了“C++对C语言的改进”,包括内联函数、引用参数、默认参数、一元作用域运算符、函数重载和函数模板。这里已经修改了头文件表,并包括了许多新的头文件,读者将会在书中一一遇到。练习3.54在投银子游戏程序中增加了赌注的功能。“有关对象的思考”一节介绍如何确定电梯模拟程序中类的属性(即数据)。
    第4章“数组”,介绍由同一种类型的数据、一组数据和相关的数据所组成的数组。本章介绍了许多例子,包括单下标数组和双下标数组。众所周知,正确地构造数据和有效地使用控制结构一样,都是合理开发结构化程序的关键。本章的例子介绍各种常见数组操作、打印直方图、排序数据、将数据传递到函数,并介绍了调查数据分析(简单统计)。本章的一个特点是介绍了基本排序与查找技术并讨论了折半查找对线性查找的巨大改进。本章结束处的38个练习包括各种有趣而有一定难度的问题,如改进排序技术、设计机票订购系统、引入龟图的概念(在L0G0语言中很有名)和人工智能领域中非常著名的“骑士旅行”与“八皇后”的问题,引人启发式编程的概念。练习中有8个递归问题,包括选择排序、回文、线性查找、折半查找、八皇后、打印数组、逆向打印字符串和寻找数组中的最小值。本章仍然使用c语言式数组,这实际上是内存中指向数组内容的指针(第5章)。我们将把数组变为完全成熟的对象。第8章要用运算符重载技术建立Array类,生成比第4章的数组更健壮、更简单的Array类。第20章“标准模板库(STL)”中介绍STL中的vector类,在第20章使用迭代器及其算法时,可以用vector把数组变为完全成熟的对象。“有关对象的思考”一节介绍如何在电梯模拟程序中确定类的行为(即函数)。
    第5章“指针与字符串”,介绍C++语言中更强大也难于掌握的特性:指针。本章详细介绍指针运算符、按引用调用、指针表达式、指针算法、指针与数组的关系、指针数组和函数指针。C++中的指针、数组与字符串之间有非常密切的关系,因此我们介绍基本字符串操作概念,介绍一些最常用的字符串操作函数,如gedine(输入一行文本)、strcpy和strncpy(复制字符串)、strcat和strncat(连接两个字符串)、strcmp和strncmp(比较两个字符串)、strtok(将字符串标记化为各个组件)和strlen(计算字符串长度)。本章结束处的49个练习包括模拟传统的龟兔赛跑、洗牌与发牌算法、递归快速排序和递归走迷宫。还有专门一节“建立自己的计算机”。本节介绍机器语言编程和一个设计与实现计算机模拟程序的题目,学生可以编写和运行机器语言程序。这个特性对于想了解计算机如何工作的读者特别有用。我们的学生很喜欢这个项目,因为经常能实现程序的重大改进,练习中就提出了许多改进。第15章另有一节介绍如何建立编译器,可以将编译器中产生的机器语言放到本章建立的机器语言模拟程序中执行,编译器与模拟程序之间的信息通过第14章介绍的顺序文件进行通信。还有一个特殊小节,介绍有关文本分析、字处理、按不同格式打印日期、支票保护、写出支票金额大写、莫尔斯码和公制/英制换算的复杂字符串操作练习。学完第19章的string类后,学生要返回来复习这些字符串操作练习,许多人发现,指针问题是编程课程中最难的部分。在c和原始C++中,数组和字符串实际上是内存中数组和字符串内容的指针,即使函数名也是指针。认真学习本章将使读者深入了解复杂的指针问题。我们在本书稍后会把数组和字符串变为成熟的对象。
    第8章会介绍用运算符重载建立自定义的Array和String类。第19章介绍string标准库类和如何操作string对象。第20章介绍vector类c第5章有一些较难的练习,请试试“建立自己的计算机”一节。“有关对象的思考”一节介绍如何确定电梯模拟程序中类之间的关系。
    第6章“类与数据抽象(一)”,开始介绍基于对象的编程思想:本章讨论如何正确进行数据抽象,即通过语言(C++)表达实现抽象数据类型(ADT)。近年来,数据抽象已成为讲解“算法课程”的主要课题。第6章、第7章和第8章详细介绍数据抽象。第6章将ADT实现为struct,实现ADT作为C++式的类,并介绍两种方法的比较以及使用C++式类的优点。还将介绍访问类成员,分开接口与实现方法,使用访问函数和工具函数,用构造函数初始化对象,用析构函数删除对象,通过默认的成员复制进行赋值和软件复用性。本章练习要开发复数、有理数、时间、日期、长方形、大整数和玩连城游戏的类。学生通常喜欢有关游戏的程序。“有关对象的思考”一节要求对电梯模拟程序中的每个类编写类的头文件和成员函数定义的源文件,其概述了运行电梯模拟程序的驱动程序操作,并提供一些有用的输出。对数字感兴趣的读者可以生成Complex类(对复数)、Rational类(对有理数)和HugeInteger类(对任意大的整数)。
    第7章“类与数据抽象(二)”,继续介绍类和数据抽象。本章介绍声明与使用常量对象、常量成员函数,复合――建立以其他类对象为成员的类,友元函数与友元类对类的private和protected成员有特殊访问权限,this指针使对象可以知道自己的地址,动态内存分配,包含与操作类范围数据的static类成员,常见抽象数据类型的例子(数组、字符串与队列),容器类和迭代器。本章的练习要求学生开发一个存款账号类和保存整数集合的类。在讨论const对象时,我们简单介绍新的关键字mutable(第21章将会介绍),mutable用于修改const对象中“不可见”的实现方法。我们通过new和delete介绍动态内存分配。new失败时,它在旧式C++中返回0指针。第7章到第12章用这个旧式方法。第13章介绍新方法,在new失败时抛出异常。在static类讨论中增加一个基于视频游戏的例子。我们在教材中强调要把类的方法隐藏起来,不让客户看到。然后介绍类首部中的pnvaLe数据,其显然要表示实现方法。我们另有一节介绍代理类,使类的客户看不到Private数据。“有关对象的思考”一节要求在电梯模拟程序中加进动态内存分配与复合。学生非常喜欢生成Integerset类的练习,由此引入第8章介绍的“运算符重载”的概念。
    第8章“运算符重载”,是C++课程中最著名的课题,学生很喜欢这方面的内容。他们发现运算符重载与第6章和第7章介绍的抽象数据类型非常匹配。运算符重载使程序员可以告诉编译器如何对新型对象使用现有运算符。C++已经知道这些运算符如何处理内部类型对象,如整数、浮点数和字符。但如果生成新的字符串类,加号是什么意思呢?许多程序员用加号表示字符串类的连接。
    第8章将介绍如何重载加号,使表达式中出现两个字符串对象时,编译器产生的函数调用“运算符函数”连接两个字符串。本章介绍运算符重载的基础、运算符重载的限制、重载类成员函数和非成员函数、重载一元与二元运算符以及进行类型转换。本章的特色是收集了大量实例,包括数组类、字符串类、日期类、大整数类和复数类(后两者在练习中有完整的源代码)。喜爱数学的学生可以在练习中生成多项式类。我们发现学生很喜欢该内容、这与大多数编程语言和教程中的做法有所不同。运算符重载是个复杂课题,但非常有意思。巧妙使用运算符重载可以使类变得更为实用。Anay
    和String类的介绍对使用string和vector标准库类的学生特别有用。利用第6章、第7章和第8章介绍的技术,可以建立一个Date类,如果过去使用过这个类,则现在很容易解决其中的“千年虫”问题。练习还鼓励学生对Complex、Rational和HugeInteger类增加运算符重载功能,像数学中一样方便地用运算符操作这些类的对象,而不是像第7章练习中使用函数调用。
    第9章“继承”,介绍面向对象编程最基本的功能之一。继承是软件复用的一种形式,通过吸收现有类的功能再增加相应新功能而方便快捷地生成新类。本章介绍基类与派生类、protected成员、Public继承、Protected继承、private继承、直接基类、间接基类、基类与派生类中的构造函数和析构函数以及继承的软件工程。本章比较继承(“是”关系)和复合(“有”关系),引入“使用”和“知道”关系:本章的特色是几个重要实例,特别是用一个较长的实例实现点、圆、圆柱类的继承。
    本章最后介绍一个多重继承的实例,这是C++的高级特性,使派生类可以继承多个基类的属性与行为。本章的练习要求学生比较通过继承与复合生成新类,扩展本章介绍的各种继承层次,对四边形、梯形、平行四边形、长方形和正方形编写继承层次,对二维形状和三维形状生成更加一般化的继承层次。我们对大学社区的成员修改继承层次,显示多种继承的例子。第21章继续介绍多重继承,讨论“菱形继承”问题和如何用virtual基类解决这个问题。
    第10章“虚函数和多态性”,介绍面向对象编程的另一基本功能,即多态操作。多个类通过继承与同一基类相联系时,每个派生对象可以作为一个基类对象。这样就可以独立于派生类对象的具体类型,以更一般化的方法编写程序。新的对象类型可以用同一程序处理,从而使系统更可扩展。多态可以使程序消除复杂的switch逻辑,利用简单的直线逻辑。例如,视频游戏的屏幕管理器可以直接将绘图消息发送到要绘制的对象链表中每一个对象。每个对象知道如何绘制自己。新对象加进程序中时,不需要修改程序,只要新对象知道如何绘制自己就可以。这种编程方式常用于编写如今常见的图形用户界面(GUI)。本章介绍通过virtua1实现多态操作的机制,区别抽象类(无法实例化对象的类)与具体类(可以实例化对象的类)。抽象类用于提供整个层次中类的可继承接口。本章的一个特色是两个重要的多态实例―――工资单系统和第9章介绍的实现点、圆、圆柱类继承层次的另一种形式。本章练习要求学生讨论许多概念问题和方法,在形状层次中增加抽象类,开发基本图形软件包;修改本章的员工类,并要求在所有这些项目中使用虚函数和多态编程。本章的两个多态实例显示了相反的继承样式。第一个例子(工资单系统)是继承的“合理”用法。第二个是第9章介绍的实现点、圆、圆柱类继承层次的另一种形式,是专业人员所谓的“结构化继承”,不如第一个例子那么自然合理,但理论上是正确的。我们决定保留这两个例子,因为本书的这一版本中增加了多态、虚函数和动态关联技术的有关内容。我们曾经面向高级软件工程师举办了C++专业研讨会,他们赞赏第一版中两个多态的例子,但觉得还缺了点什么。我们介绍了C++中如何用多态编程,但读者还关心多态编程的操作开销。他们认为多态是个很好的特性,但显然是有代价的。因此我们的专业人士认为有必要更加深人地介绍C++中如何实现多态,从而确定用多态编程时要付出的时间和内存代价。为此,我们建立了一个演示,显示C++编译器支持多态编程样式时自动建立的vtable(虚函数表)。我们在介绍点、圆、圆柱类层次的类中给出该表。与会人士认为这些表确实提供了对每个新项目确定是否适合用多态编程样式的信息。我们把这个例子放在10.10节,vtable放在图10.3。请认真观察该图,以便深入了解用继承和多态编程时对计算机的影响。
    第11章“C++输入/输出流”。包含C++中引入的新的面向对象式输入/输出的详细介绍。本章介绍C++的各种I/0功能,包括流插入运算符、使用流读取运算符输入、类型安全I/0(对C语言的巨大改进)、格式化I/O、非格式化I/O(对性能)、控制流的基数(十进制、十六进制或八进制)的流操纵算子、浮点数、控制域宽、用户自定义流操纵算子、流格式状态、流错误状态、用户自定义类型对象的I/O以及连接输出流与输入流(保证要让用户输入响应之前出现提示)o本章有大量练习要求学生编写各种程序,测试文中的大多数I/0功能。
    第12章“模板”,介绍C++语言演变中的一个最新补充。函数模板在第3章引人,第12章列举了更多函数模板的例子。类模板使程序员可以抓住抽象数据类型的本质(如堆栈、数组和队列),然后用少量补充代码生成特定类型的ADT版本(如int队列、float队列、字符串队列等等)。为此,模板类通常称为类型参数。本章介绍使用类型参数和无类型参数,考虑模板与其他c++概念之间的交互,如继承、友元和static成员。练习要求学生编写各种函数模板和类模板,并在完整程序中采用这些模板。这一版的第12章没有任何补充,但我们在第20章介绍了标准模板库(STL)容器、迭代器和算法,大大改进了模板处理。
    第13章“异常处理”,介绍C++语言中一个更新的改进。异常处理使程序员可以编写更健壮、更具容错性、更适合业务关键和任务关键情况的程序。本章介绍何时需要异常处理,介绍异常处理的基础,tv块、th一语句和catch块,介绍何时、如何重新抛出异常,介绍如何编写带有异常处理和不希望异常处理的进程,介绍异常与构造函数、析构函数、继承之间的重要关系。本章提供了43个练习,通过程序演示C++异常处理功能的强大和丰富多彩。我们在图13.2的例子中增加了重新抛出异常的“有生命力的代码”,图13.3增加堆栈解退的“有生命力的代码”。我们在图13.4和图13.5中增加两个例子,演示内存不足时new失败的两种情况。在C++草案标准之前,new失败返回0,就像C语言中malloc失败返回NULL指针值(如图13.4)。图13.5显示了新的样式,new失败返回
    bad―doc异常。我们用图13.6的例子演示如何用set―Hew―handler指定处理内存不足情况的自定义函数。我们增加13.15节,讨论新的auto―Ptr类模板,保证正确地释放动态分配的内存,以防止内存泄漏。我们还在13.16节讨论新标准库的异常层次。
    第14章“文件处理”,介绍用顺序访问和随机访问方法处理文本文件的技术。本章首先介绍从位、字节、域、记录到文件的数据层次;然后显示c++的简单文件和字符流视图。顺序访问文件用三个程序讨论,显示如何打开和关闭文件、如何在文件中顺序存储数据和如何从文件中顺序读取数据。随机访问文件用4个程序讨论,显示如何顺序生成随机访问文件,如何顺序读取和写入随机访问文件,第4个随机访问程序组合了许多顺序和随机文件的访问方法,建立一个完整的事务处理程序。专业研讨会的学员告诉我们,学习文件处理的内容之后,他们可以建立相当大的文件处理程序并立即在公司使用。练习要求学生实现各种程序,建立和处理顺序访问文件和随机访问文件。第14章删除了字符串流处理的有关内容,我们把这个内容改写之后放在第19章末尾。
    第15章“数据结构”,介绍生成和操作动态数据结构的技术。本章首先介绍自引用类和动态内存分配,然后介绍如何生成与维护各种动态数据结构,包括链表、队列(或等待队列)、堆栈与树。对每种数据类型,我们介绍完整的、可工作的程序,并显示示例输出,实际地帮助学生掌握指针。本章的大量例子使用间接地址和双间接地址,这是特别难掌握的概念。使用这种指针时的一个问题是学生很难将数据结构及其节点链接方式直观化。因此我们用图形显示链接及其生成顺序。有关二叉树的例子特别适合演示指针和动态数据结构。这个例子生成二叉树,强制消除重复元素,并引入递归的前序遍历、中序遍历和后序遍历的树遍历方法。学生学习和实现这个例子之后会很有成就感,他们特别欣赏中序遍历方法按排序顺序打印节点值。本章包括大量例子,特别推出“建立自己的编译器”练习。这个练习让学生开发中缀/后缀转换程序和后缀表达式求值程序,然后修改后缀表达式求值算法,产生机器语言代码。编译器将这个代码放到一个文件中(用第1章介绍的方法)。然后学生在第5章练习中建立的机器语言模拟程序上运行编译器产生的机器语言。本章的35个练习包括一个使用队列的超级市场模拟程序,递归查找链表,递归打印反序链表,删除二叉树的节点、按层次顺序遍历二叉树、打印树、编写优化编译器的一部分、编写解释器、插人/删除链表项目、不用尾指针而实现链表和队列、分析二叉树查找与排序性能以及实现索引链表类。第15章的内容有所调整但没有加强,还是介绍建立重要数据结构的细节。学习第15章之后,学生就可以处理第20章的STL容器、迭代器与算法。STL容器是预打包的模板化数据结构,大多数程序员发现其对于要实现的大多数应用程序已经足够使用。STL在实现复用方面前进了一大步。
    第16章“位、字符、字符串和结构”,介绍各种重要特性。C++强大的位操作功能使程序员利用低级硬件功能编写程序,这样就使程序能处理位字符串、设置各个位的开或关以及在内存中更紧凑地存放信息。这种功能通常只在低级汇编语言中才有,对编写操作系统和网络软件等系统软件的程序员非常有用。第5章曾经介绍C语言式的char字符串操作,介绍了最常见的字符串操作函数。第16章继续介绍字符和C语言式的char字符串。我们介绍c叮Pe库的各种字符串操作功能,包括测试字符是否为数字、字母、字母或数字字符、十六进制数、小写字母、大写字母等等。我们列举了各种字符串相关库的其他字符串操作函数,在完整、可运行的C++程序环境中显示每个函数。结构就像Pascal和其他语言中的记录,累计各种类型的数据项目。第14章用结构形成包括信息记录的文件。结构和第15章介绍的指针与动态内存分配一起使用,形成链表、队列、堆栈和树等动态数据结构。本章提供了改进的高性能洗牌和发牌模拟程序。教师可以利用这个机会强调算法的质量。36个练习鼓励学生试用本章介绍的最重要功能,并让学生开发一个拼写检查程序。第1章到第5章、第16章到第18章的内容主要是C++中C语言的遗留部分。具体地说,本章深人介绍C语言式的char字符串,使得C++程序员可以处理C语言遗留代码。第19章介绍string类并把字符串作为成熟的对象进行操作。
    第订章“预处理器”,详细介绍预处理指令。本章更完整地介绍#include指令,在文件编译之前用指定文件的副本代替这条指令,并介绍#define指令生成符号化常量和宏。本章讨论条件编译,让程序员控制预处理指令的执行和编译程序代码。我们介绍#运算符将操作数变为字符串,##运算符连接两个标记,还介绍各种预定义的预处理器的符号化常量(_HNE_、_FIM_、―DATE_、_TIME_和_STDC_)。最后介绍assen.h头文件中的assert宏,assert在程序测试、调试和验证中很重要。我们在许多例子中使用assert,但读者可能已经开始使用异常处理(见第13章)。
    第18章“C语言遗留代码问题”,介绍其他课题,包括人门课程不常介绍的一些高级问题。我们显示如何重定向程序的输入来自一个文件,重定向程序的输出放到一个文件中,重定向程序的输出为另一程序的输入(管道),将程序的输出添加到现有文件。开发使用变长参数表的函数,将命令行参数传递到main函数并在程序中使用,编译组件分布在多个文件中的程序,在程序终止时执行用atexit注册的函数,用函数exit终止程序执行。使用com,和volatile类型限定符,用整数和浮点数后缀指定数字常量类型,用信号处理库捕获意外事件,用calloc和realloc生成与使用动态数组,使用联合体作为节省内存空间的手段,在C++程序连接C语言遗留代码时使用连接指定。从标题可以看出,本章要帮助c++程序员使用c语言遗留代码。
    第19章“string类与字符串流处理”,本章将介绍C++从内存中的字符串输入数据和将数据输出到内存中的字符串的功能,这些功能通常称为内核格式化或字符串流处理。本章的内容是全新的。
    string类是标准库必需的组件。尽管我们把这些内容放在本书接近尾声的地方,但许多教师把“字符串作为成熟对象”的课题放在课程的前面介绍。我们在第5章和后面保留C语言式字符串介绍有几个原因:第一,我们认为它能加强读者对指针的了解;第二,我们认为在今后十年内,C++程序员还要阅读和修改大量C语言遗留代码,这是近20年累计下来的,这些代码把字符串作为指针处理,前几年大量的C++代码也是这样处理:第19章讨论string赋值、连接与比较。我们介绍如何确定各种string特性,如string的长度、容量以及是否为空。我们讨论如何调整string长度,考虑各种find函数如何让用户寻找string中的子串(向前或向后搜索string),我们介绍如何
按第一贴的“给分”键,给分。
moqingsong
论坛版主
论坛版主
  • 注册日期2002-04-07
  • 最后登录2011-02-03
  • 粉丝0
  • 关注0
  • 积分74分
  • 威望71点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-03 21:28
《C++Primer》
《The C++ Programming Language》
《深入浅出MFC》
《VC++技术内幕》
《Effective C++》
《深度探索C++对象模型》
《More Effective C++》
哪本更好?
我只看过大学教程这一本。 :(
按第一贴的“给分”键,给分。
maomao
驱动牛犊
驱动牛犊
  • 注册日期2001-06-22
  • 最后登录2002-12-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-08 17:58
有下载的地方吗?
[color=red]我只想好好呼吸一下...[/color]
koujingzhong
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2002-11-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-15 12:40
哪可以下载
飞天猩猩
驱动巨牛
驱动巨牛
  • 注册日期2001-09-24
  • 最后登录2008-06-17
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望22点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-05 13:20
哪可以下载

没有人回答?
游客

返回顶部