内容简介

  《c++编程思想(两卷合订本)》曾荣获美国《软件开发》杂志评选的1996年jolt生产力大奖,中文版自2000年推出以来,经久不衰,获得了读者的充分肯定和高度评价。

  《c++编程思想(两卷合订本)》的第1卷是在第1版的基础上进行了更加深入的分析和修改后得到的第2版,其内容更加集中,可以供不同程度的读者选择阅读。《C++编程思想(两卷合订本)》第2卷介绍了c++实用的编程技术和**的实践方法,深入探究了异常处理方法和异常安全设计;介绍c++的字符串、输入输出流的现代用法;解释多重继承问题的难点,描述了典型的设计模式及其实现,特别介绍了多线程处理编程技术。

  《c++编程思想(两卷合订本)》是c++领域内一本专业的著作,书中的内容、讲授方法、练习既适合课堂教学,又适合读者自学。《C++编程思想(两卷合订本)》适合作为高等院校计算机及相关专业的本科生、研究生的教材,也可供从事软件开发的研究人员和科技工作者参考。

作者简介

  BruceEckel是MindView公司的总裁,向客户提供软件咨询和培训。他是C++标准委员会拥有表决权的成员之一,他也是《Java编程思想》(该书第3版影印版及翻译版已由机械工业出版社引进出版)。他曾经写过另5本面向对象编程书籍,发表过150篇以上的文章,是多本计算机杂志的专栏作家。他经常参加世界各地的研讨会并进行演讲。



  ChuckAllison曾是《C/C++Users》杂志的资深编辑,著有《C/C++CodeCapsules》一书。他是C++标准委员会的成员,犹他谷州立学院的计算机科学教授。他还是FreshSources公司的总裁,该公司专门从事软件培训和教学任务。

目录

出版者的话
出版说明
第1卷标准c++导引
译者序
前言
第1章对象导言
1.1抽象的过程
1.2对象有一个接口
1.3实现的隐藏
1.4实现的重用
1.5继承:重用接口
1.5.1is-a关系和is-like-a关系
1.6具有多态性的可互换对象
1.7创建和销毁对象
1.8异常处理:应对错误
1.9分析和设计
1.9.1第0阶段:制定计划
1.9.2第1阶段:我们在做什么
1.9.3第2阶段:我们将如何建立对象
1.9.4第3阶段:创建核心
1.9.5第4阶段:迭代用例
1.9.6第5阶段:进化
1.9.7计划的回报
1.10极限编程
1.10.1先写测试
1.10.2结对编程
1.11为什么c++会成功
1.11.1一个较好的c
1.11.2延续式的学习过程
1.11.3效率
1.11.4系统更容易表达和理解
1.11.5尽量使用库
1.11.6利用模板的源代码重用
1.11.7错误处理
1.11.8大型程序设计
1.12为向oop转变而采取的策略
1.12.1指导方针
1.12.2管理的障碍
1.13小结
第2章对象的创建与使用
2.1语言的翻译过程
2.1.1解释器
2.1.2编译器
2.1.3编译过程
2.2分段编译工具
2.2.1声明与定义
2.2.2连接
2.2.3使用库文件
2.3编写第一个c++程序
2.3.1使用iostream类
2.3.2名字空间
2.3.3程序的基本结构
2.3.4“hello,world!”
2.3.5运行编译器
2.4关于输入输出流
2.4.1字符数组的拼接
2.4.2读取输入数据
2.4.3调用其他程序
2.5字符串简介
2.6文件的读写
2.7vector简介
2.8小结
2.9练习
第3章c++中的c
3.1创建函数
3.1.1函数的返回值
3.1.2使用c的函数库
3.1.3通过库管理器创建自己的库
3.2执行控制语句
3.2.1真和假
3.2.2if-else语句
3.2.3while语句
3.2.4do-while语句
3.2.5for语句
3.2.6关键字break和continue
3.2.7switch语句
3.2.8使用和滥用goto
3.2.9递归
3.3运算符简介
3.3.1优先级
3.3.2自增和自减
3.4数据类型简介
3.4.1基本内建类型
3.4.2bool类型与true和false
3.4.3说明符
3.4.4指针简介
3.4.5修改外部对象
3.4.6c++引用简介
3.4.7用指针和引用作为修饰符
3.5作用域
3.5.1实时定义变量
3.6指定存储空间分配
3.6.1全局变量
3.6.2局部变量
3.6.3静态变量
3.6.4外部变量
3.6.5常量
3.6.6volatile变量
3.7运算符及其使用
3.7.1赋值
3.7.2数学运算符
3.7.3关系运算符
3.7.4逻辑运算符
3.7.5位运算符
3.7.6移位运算符
3.7.7一元运算符
3.7.8三元运算符
3.7.9逗号运算符
3.7.10使用运算符时的常见问题
3.7.11转换运算符
3.7.12c++的显式转换
3.7.13sizeof-独立运算符
3.7.14asm关键字
3.7.15显式运算符
3.8创建复合类型
3.8.1用typedef命名别名
3.8.2用struct把变量结合在一起
3.8.3用enum提高程度清晰度
3.8.4用union节省内存
3.8.5数组
3.9调试技巧
3.9.1调试标记
3.9.2把变量和表达式转换成字符串
3.9.3c语言assert()宏
3.10函数地址
3.10.1定义函数指针
3.10.2复杂的声明和定义
3.10.3使用函数指针
3.10.4指向函数的指针数组
3.11make:管理分段编译
3.11.1make的行为
3.11.2《C++编程思想(两卷合订本)》中的makefile
3.11.3makefile的一个例子
3.12小结
3.13练习
第4章数据抽象
4.1一个袖珍c库
4.1.1动态存储分配
4.1.2有害的猜测
4.2哪儿出问题
4.3基本对象
4.4什么是对象
4.5抽象数据类型
4.6对象细节
4.7头文件形式
4.7.1头文件的重要性
4.7.2多次声明问题
4.7.3预处理器指示#define、#ifdef
和#endif
4.7.4头文件的标准
4.7.5头文件中的名字空间
4.7.6在项目中使用头文件
4.8嵌套结构
4.8.1全局作用域解析
4.9小结
4.10练习
第5章隐藏实现
5.1设置限制
5.2c++的访问控制
5.2.1protected说明符
5.3友元
5.3.1嵌套友元
5.3.2它是纯面向对象的吗
5.4对象布局
5.5类
5.5.1用访问控制来修改stash
5.5.2用访问控制来修改stack
5.6句柄类
5.6.1隐藏实现
5.6.2减少重复编译
5.7小结
5.8练习
第6章初始化与清除
6.1用构造函数确保初始化
6.2用析构函数确保清除
6.3清除定义块
6.3.1for循环
6.3.2内存分配
6.4带有构造函数和析构函数的stash
6.5带有构造函数和析构函数的stack
6.6聚合初始化
6.7默认构造函数
6.8小结
6.9练习
第7章函数重载与默认参数
7.1名字修饰
7.1.1用返回值重载
7.1.2类型安全连接
7.2重载的例子
7.3联合
7.4默认参数
7.4.1占位符参数
7.5选择重载还是默认参数
7.6小结
7.7练习
第8章常量
8.1值替代
8.1.1头文件里的const
8.1.2const的安全性
8.1.3聚合
8.1.4与c语言的区别
8.2指针
8.2.1指向const的指针
8.2.2const指针
8.2.3赋值和类型检查
8.3函数参数和返回值
8.3.1传递const值
8.3.2返回const值
8.3.3传递和返回地址
8.4类
8.4.1类里的const
8.4.2编译期间类里的常量
8.4.3const对象和成员函数
8.5volatile
8.6小结
8.7练习
第9章内联函数
9.1预处理器的缺陷
9.1.1宏和访问
9.2内联函数
9.2.1类内部的内联函数
9.2.2访问函数
9.3带内联函数的stash和stack
9.4内联函数和编译器
9.4.1限制
9.4.2向前引用
9.4.3在构造函数和析构函数里隐藏行为
9.5减少混乱
9.6预处理器的更多特征
9.6.1标志粘贴
9.7改进的错误检查
9.8小结
9.9练习
第10章名字控制
10.1来自c语言中的静态元素
10.1.1函数内部的静态变量
10.1.2控制连接
10.1.3其他存储类型说明符
10.2名字空间
10.2.1创建一个名字空间
10.2.2使用名字空间
10.2.3名字空间的使用
10.3c++中的静态成员
10.3.1定义静态数据成员的存储
10.3.2嵌套类和局部类
10.3.3静态成员函数
10.4静态初始化的相依性
10.4.1怎么办
10.5替代连接说明
10.6小结
10.7练习
第11章引用和拷贝构造函数
11.1c++中的指针
11.2c++中的引用
11.2.1函数中的引用
11.2.2参数传递准则
11.3拷贝构造函数
11.3.1按值传递和返回
11.3.2拷贝构造函数
11.3.3默认拷贝构造函数
11.3.4替代拷贝构造函数的方法
11.4指向成员的指针
11.4.1函数
11.5小结
11.6练习
第12章运算符重载
12.1两个极端
12.2语法
12.3可重载的运算符
12.3.1一元运算符
12.3.2二元运算符
12.3.3参数和返回值
12.3.4不常用的运算符
12.3.5不能重载的运算符
12.4非成员运算符
12.4.1基本方针
12.5重载赋值符
12.5.1operator=的行为
12.6自动类型转换
12.6.1构造函数转换
12.6.2运算符转换
12.6.3类型转换例子
12.6.4自动类型转换的缺陷
12.7小结
12.8练习
第13章动态对象创建
13.1对象创建
13.1.1c从堆中获取存储单元的方法
13.1.2operatornew
13.1.3operatordelete
13.1.4一个简单的例子
13.1.5内存管理的开销
13.2重新设计前面的例子
13.2.1使用deletevoid*可能会出错
13.2.2对指针的清除责任
13.2.3指针的stash
13.3用于数组的new和delete
13.3.1使指针更像数组
13.4耗尽内存
13.5重载new和delete
13.5.1重载全局new和delete
13.5.2对于一个类重载new和delete
13.5.3为数组重载new和delete
13.5.4构造函数调用
13.5.5定位new和delete
13.6小结
13.7练习
第14章继承和组合
14.1组合语法
14.2继承语法
14.3构造函数的初始化表达式表
14.3.1成员对象初始化
14.3.2在初始化表达式表中的内建类型
14.4组合和继承的联合
14.4.1构造函数和析构函数调用的次序
14.5名字隐藏
14.6非自动继承的函数
14.6.1继承和静态成员函数
14.7组合与继承的选择
14.7.1子类型设置
14.7.2私有继承
14.8protected
14.8.1protected继承
14.9运算符的重载与继承
14.10多重继承
14.11渐增式开发
14.12向上类型转换
14.12.1为什么要“向上类型转换”
14.12.2向上类型转换和拷贝构造函数
14.12.3组合与继承(再论)
14.12.4指针和引用的向上类型转换
14.12.5危机
14.13小结
14.14练习
第15章多态性和虚函数
15.1c++程序员的演变
15.2向上类型转换
15.3问题
15.3.1函数调用捆绑
15.4虚函数
15.4.1扩展性
15.5c++如何实现晚捆绑
15.5.1存放类型信息
15.5.2虚函数功能图示
15.5.3撩开面纱
15.5.4安装vpointer
15.5.5对象是不同的
15.6为什么需要虚函数
15.7抽象基类和纯虚函数
15.7.1纯虚定义
15.8继承和vtable
15.8.1对象切片
15.9重载和重新定义
15.9.1变量返回类型
15.10虚函数和构造函数
15.10.1构造函数调用次序
15.10.2虚函数在构造函数中的行为
15.11析构函数和虚拟析构函数
15.11.1纯虚析构函数
15.11.2析构函数中的虚机制
15.11.3创建基于对象的继承
15.12运算符重载
15.13向下类型转换
15.14小结
15.15练习
第16章模板介绍
16.1容器
16.1.1容器的需求
16.2模板综述
16.2.1模板方法
16.3模板语法
16.3.1非内联函数定义
16.3.2作为模板的intstack
16.3.3模板中的常量
16.4作为模板的stash和stack
16.4.1模板化的指针stash
16.5打开和关闭所有权
16.6以值存放对象
16.7迭代器简介
16.7.1带有迭代器的栈
16.7.2带有迭代器的pstash
16.8为什么使用迭代器
16.8.1函数模板
16.9小结
16.10练习
附录a编码风格
附录b编程准则
附录c推荐读物
第2卷实用编程技术
译者序
前言
第一部分建立稳定的系统
第1章异常处理
1.1传统的错误处理
1.2抛出异常
1.3捕获异常
1.3.1try块
1.3.2异常处理器
1.3.3终止和恢复
1.4异常匹配
1.4.1捕获所有异常
1.4.2重新抛出异常
1.4.3不捕获异常
1.5清理
1.5.1资源管理
1.5.2使所有事物都成为对象
1.5.3auto_ptr
1.5.4函数级的try块
1.6标准异常
1.7异常规格说明
1.7.1更好的异常规格说明
1.7.2异常规格说明和继承
1.7.3什么时候不使用异常规格说明
1.8异常安全
1.9在编程中使用异常
1.9.1什么时候避免异常
1.9.2异常的典型应用
1.10使用异常造成的开销
1.11小结
1.12练习
第2章防御性编程
2.1断言
2.2一个简单的单元测试框架
2.2.1自动测试
2.2.2testsuite框架
2.2.3测试套件
2.2.4测试框架的源代码
2.3调试技术
2.3.1用于代码跟踪的宏
2.3.2跟踪文件
2.3.3发现内存泄漏
2.4小结
2.5练习
第二部分标准c++库
第3章深入理解字符串
3.1字符串的内部是什么
3.2创建并初始化c++字符串
3.3对字符串进行操作
3.3.1追加、插入和连接字符串
3.3.2替换字符串中的字符
3.3.3使用非成员重载运算符连接
3.4字符串的查找
3.4.1反向查找
3.4.2查找一组字符第1次或最后一次出现的位置
3.4.3从字符串中删除字符
3.4.4字符串的比较
3.4.5字符串和字符的特性
3.5字符串的应用
3.6小结
3.7练习
第4章输入输出流
4.1为什么引入输入输出流
4.2救助输入输出流
4.2.1插入符和提取符
4.2.2通常用法
4.2.3按行输入
4.3处理流错误
4.4文件输入输出流
4.4.1一个文件处理的例子
4.4.2打开模式
4.5输入输出流缓冲
4.6在输入输出流中定位
4.7字符串输入输出流
4.7.1输入字符串流
4.7.2输出字符串流
4.8输出流的格式化
4.8.1格式化标志
4.8.2格式化域
4.8.3宽度、填充和精度设置
4.8.4一个完整的例子
4.9操纵算子
4.9.1带参数的操纵算子
4.9.2创建操纵算子
4.9.3效用算子
4.10输入输出流程序举例
4.10.1维护类库的源代码
4.10.2检测编译器错误
4.10.3一个简单的数据记录器
4.11国际化
4.11.1宽字符流
4.11.2区域性字符流
4.12小结
4.13练习
第5章深入理解模板
5.1模板参数
5.1.1无类型模板参数
5.1.2默认模板参数
5.1.3模板类型的模板参数
5.1.4typename关键字
5.1.5以template关键字作为提示
5.1.6成员模板
5.2有关函数模板的几个问题
5.2.1函数模板参数的类型推断
5.2.2函数模板重载
5.2.3以一个已生成的函数模板地址作为参数
5.2.4将函数应用到stl序列容器中
5.2.5函数模板的半有序
5.3模板特化
5.3.1显式特化
5.3.2半特化
5.3.3一个实例
5.3.4防止模板代码膨胀
5.4名称查找问题
5.4.1模板中的名称
5.4.2模板和友元
5.5模板编程中的习语
5.5.1特征
5.5.2策略
5.5.3奇特的递归模板模式
5.6模板元编程
5.6.1编译时编程
5.6.2表达式模板
5.7模板编译模型
5.7.1包含模型
5.7.2显式实例化
5.7.3分离模型
5.8小结
5.9练习
第6章通用算法
6.1概述
6.1.1判定函数
6.1.2流迭代器
6.1.3算法复杂性
6.2函数对象
6.2.1函数对象的分类
6.2.2自动创建函数对象
6.2.3可调整的函数对象
6.2.4更多的函数对象例子
6.2.5函数指针适配器
6.2.6编写自己的函数对象适配器
6.3stl算法目录
6.3.1实例创建的支持工具
6.3.2填充和生成
6.3.3计数
6.3.4操作序列
6.3.5查找和替换
6.3.6比较范围
6.3.7删除元素
6.3.8对已排序的序列进行排序和运算
6.3.9堆运算
6.3.10对某一范围内的所有元素进行运算
6.3.11数值算法
6.3.12通用实用程序
6.4创建自己的stl风格算法
6.5小结
6.6练习
第7章通用容器
7.1容器和迭代器
7.2概述
7.2.1字符串容器
7.2.2从stl容器继承
7.3更多迭代器
7.3.1可逆容器中的迭代器
7.3.2迭代器的种类
7.3.3预定义迭代器
7.4基本序列容器:vector、list和deque
7.4.1基本序列容器的操作
7.4.2向量
7.4.3双端队列
7.4.4序列容器间的转换
7.4.5被检查的随机访问
7.4.6链表
7.4.7交换序列
7.5集合
7.6堆栈
7.7队列
7.8优先队列
7.9持有二进制位
7.9.1bitset[n]
7.9.2vector[bool]
7.10关联式容器
7.10.1用于关联式容器的发生器和填充器
7.10.2不可思议的映像
7.10.3多重映像和重复的关键字
7.10.4多重集合
7.11将stl容器联合使用
7.12清除容器的指针
7.13创建自己的容器
7.14对stl的扩充
7.15非stl容器
7.16小结
7.17练习
第三部分专题
第8章运行时类型识别
8.1运行时类型转换
8.2typeid操作符
8.2.1类型转换到中间层次类型
8.2.2void型指针
8.2.3运用带模板的rtti
8.3多重继承
8.4合理使用rtti
8.5rtti的机制和开销
8.6小结
8.7练习
第9章多重继承
9.1概论
9.2接口继承
9.3实现继承
9.4重复子对象
9.5虚基类
9.6名字查找问题
9.7避免使用多重继承
9.8扩充一个接口
9.9小结
9.10练习
第10章设计模式
10.1模式的概念
10.2模式分类
10.3简化习语
10.3.1信使
10.3.2收集参数
10.4单件
10.5命令:选择操作
10.6消除对象耦合
10.6.1代理模式:作为其他对象的前端
10.6.2状态模式:改变对象的行为
10.7适配器模式
10.8模板方法模式
10.9策略模式:运行时选择算法
10.10职责链模式:尝试采用一系列
策略模式
10.11工厂模式:封装对象的创建
10.11.1多态工厂
10.11.2抽象工厂
10.11.3虚构造函数
10.12构建器模式:创建复杂对象
10.13观察者模式
10.13.1“内部类”方法
10.13.2观察者模式举例
10.14多重派遣
10.15小结
10.16练习
第11章并发
11.1动机
11.2c++中的并发
11.3定义任务
11.4使用线程
11.4.1创建有响应的用户界面
11.4.2使用执行器简化工作
11.4.3让步
11.4.4休眠
11.4.5优先权
11.5共享有限资源
11.5.1保证对象的存在
11.5.2不恰当地访问资源
11.5.3访问控制
11.5.4使用保护简化编码
11.5.5线程本地存储
11.6终止任务
11.6.1防止输入/输出流冲突
11.6.2举例观赏植物园
11.6.3阻塞时终止
11.6.4中断
11.7线程间协作
11.7.1等待和信号
11.7.2生产者-消费者关系
11.7.3用队列解决线程处理的问题
11.7.4广播
11.8死锁
11.9小结
11.10练习
附录
附录a推荐读物
附录b其他


其他推荐