在本书中,C++专家Rob Murray就与我们分享了他宝贵的经验和建议,以帮助初中级C++程序员得到进一步的提高。 作者大量采用了实际开发中的代码来作为示例,向读者展示了那些有用的编程策略,并对那些有害的做法进行了警示。为了帮助读者更好地理解,在书中的每一章结束前,在该章中被介绍过的主要内容都被放到了一个列表中,此外,书中还给出了一些问题来激励读者们进行更多的思考和讨论。
本书在一开始就向我们讲解了如何为我们的设计选择正确的抽象,提示我们注意抽象和实现之间的区别—然后,我们就将学到如何将己得到的抽象转化成一个(或多个)C++中的类,期间进行的讨论所涵盖的范围上至高层的设计策略,下至底层的接口和实现细节。
对于C++中新增的模板特性,通过从基础开始到逐步地接触实际应用中的示例,Rob Murray向我们展示了其空前的洞察力。作者同时也向我们展示了多种特定的技巧,以使我们的程序更快、重用性更高,并且更健壮。异常是C++中另外一个新增的特性,对于何时该使用它,何时不该使用它,Murray也向我们给出了他的建议-在本书的最后,我们还可以学到如何将一个项目从C移植到C++之上,书中对该过程的讨论不但包括了其中可能出现的技术问题,也包括了使用技术的“人”的问题。
代译者序
序
第0章 简介
0. 1 关于示例代码
0. 2 本书的组织
0. 3 问题
0. 4 语言规则
第1章 抽象
1. 1 有关电话号码的抽象模型
1. 2 抽象模型间的关系
1. 3 请考虑边界条件
1. 4 使用CRC卡片来辅助设计
1. 5 小结
1. 6 问题
第2章 类
2. 1 构造函数
2. 2 赋值
2. 3 公用数据
2. 4 隐式类型转换
2. 5 操作符重载:成员或非成员?
2. 6 重载. 缺省值以及省略符
2. 7 Const
2. 8 返回值为引用
2. 9 静态对象的构造
2. 10 小结
2. 11 问题
第3章 句柄
3. 1 一个String类
3. 2 使用计数器来避免多份拷贝
3. 3 避免进行重编译:Cheshire Cat
3. 4 使用句柄来隐藏设计
3. 5 多种实现
3. 6 作为对象的句柄
3. 7 综述
3. 8 小结
3. 9 问题
第4章 继承
4. 1 is-a关系
4. 2 公有继承
4. 3 私有继承
4. 4 保护型继承
4. 5 与基类抽象的一致性
4. 6 纯虚函数
4. 7 有关继承的细节和陷阱
4. 8 小结
4. 9 问题
第5章 多重继承
5. 1 作为交集的多重继承
5. 2 虚基类
5. 3 一些有关多重继承的细节问题
5. 4 小结
5. 5 问题
第6章 考虑继承的设计
6. 1 被保护的接口
6. 2 我们的设计是否应该考虑到继承?
6. 3 一些为继承所做的设计的例子
6. 4 结论
6. 5 小结
6. 6 问题
第7章 模板
7. 1 模板类Pair
7. 2 一些有关模板的细节
7. 3 模板的实例化
7. 4 智能指针
7. 5 作为模板参数的表达式
7. 6 模板函数
7. 7 小结
7. 8 问题
第8章 模板的高级用法
8. 1 使用了模板的容器类
8. 2 示例:Block
8. 3 有关Block的设计细节
8. 4 带有迭代器的容器:List
8. 5 迭代器的设计细节
8. 6 性能上的考虑
8. 7 对模板参数的限制
8. 8 模板特化
8. 9 小结
8. 10 问题
第9章 重用
9. 1 发现和获得
9. 2 健壮性
9. 3 内存管理
9. 4 可选的内存分配方案
9. 5 传递参数给operatornew
9. 6 管理外部资源
9. 7 寻找有关内存的bug
9. 8 名字冲突
9. 9 性能
9. 10 不要去猜想, 而应该度量!
9. 11 算法
9. 12 动态内存分配中的瓶颈
9. 13 内嵌
9. 14 Tiemann法则
9. 15 小结
9. 16 问题
第10章 异常
10. 1 一个负面的声明
10. 2 为什么需要异常?
10. 3 一个异常的例子
10. 4 异常只应该用来表述异常情况
10. 5 理解异常
10. 6 责任评估
10. 7 设计异常对象
10. 8 小结
10. 9 问题
第11章 向C++移植
11. 1 选择使用C++
11. 2 采用C++
11. 3 设计和实现
11. 4 开发一个坚实的基础
11. 5 相关的思考
11. 6 小结
11. 7 问题
在专家看来, C++可以帮助软件设计者和程序员构造出模块化. 易维护以及高性能的系统. 然而, 对新手来说, 这门语言的复杂程度是一个不小的威胁. 在C++中有着许多不同的语言特性, 只有具有一定经验之后, 我们才会知道各种特性的适用情况.
本书的目的就是加速读者的这种学习进程. 大部分成功的C++程序员并不会简单地从语言规则中复述出某些章节或是条款, 相反, 他们总是习惯于自己以往工作中所获得的行之有效的那些惯用法和技巧. 我们的目的就是帮助那些C++的新手学习到那些在实践中最有效的惯用法. 同时, 我们也会在书中指出那些我们经常接触到的C++缺陷.
在本书中, 我们的讨论并不试图覆盖整个语言, 那些有关语言语义的精确定义可以查看参考手册. 我们主要帮助读者构造出可以被那些不是C++语言专家的人所理解的程序. 我们不但讨论了那些使程序变得优雅及高效的技巧, 也展示了如何使它们更容易被理解和维护的方法.
致谢
本书中的想法和编程惯用法几乎都不是我发明的. 我的目的就是把它们(在我8年的C++使用过程中从其他人那学到的并被我认为是最重要的策略和战术)用一种C++新手也能学会的方式展现给读者. 这些收获中的部分来自于实际的开发项目中(这些项目被我们从C移植到C++上)的经验, 另外一些则来自于和其他高手的讨论.
关于模板以及函数库设计的许多好的想法(包括那些隐藏在本书所给出的容器类后的想法)都来自于最初由Martin Carroll. Andrew Koenig以及Jonathan Shopiro所设计的USL标准组件库中的类. 对于在本书中出现的任何错误, 则都由我负责. Andrew Koenig是一个C++语言专家, 他对我的帮助非常大. 另外, 那些参与过我所举行过的几期“C++策略与战术”研讨会的人也帮助启发了我书写本书, 并对书中的想法进行提炼. 其他的重要的想法来自于Tom Cargill. John Carolan. Jim Coplien. Mark Linton. Gerald Schwarz, 当然, 还有Bjarne Stroustrup, 要不是他发明了C++语言, 本书也就不可能出现了.
Brian Kernighan阅读过本书的多次草稿, 他极好的反馈意见起了很大的帮助作用. 同时我还要感谢David Annatone. Steve Buroff. Tom Cargill. Bill Hopkins. Cay Horstman. Lorraine Juhl. Peter Juhl. Stan Lippman. Dennis Mancl. Scott Meyers. Barbara Moo. Lorraine Weisbrot Murray. Bjarne Stroustrup. Clovis Tondo. Steve Vinoski以及Christopher Van Wyk, 他们对本书早期的草稿提出了意见. 此外, Lorraine Weisbrot Murray对我的鼓励. 理解. 支持以及爱使得这一切努力都成为了可行的.
作者Robert B.Murray在撰写该书时是量子数据系统公司(Quantitative Data
Systems)中负责软件工程的副总裁,该公司的业务包括向财富500强(Fodune 500)中的公司提供面向对象的软件解决方案 在此之前,他曾经在AT&T的Bell实验室工作,在那里他参与了C++语言、编译器以及库的开发。他同时也是《The
C++ Report》杂志的创立编辑(founding editor),主持Obfuscated C++专栏。从1987年起,他就开始在学术会议和专业会议上向人教授C++语言。目前Murray在FNIS公司进行着软件开发的管理,他的兴趣主要包括:程序语言的开发和工具,以及轻量级的开发过程(如极限编程)
译者王昕 自1995年起接触C++编程,参与过多个C++项目的开发。曾在网上和杂志上发表过多篇有关C++的
文章。主要兴趣包括:程序语言的开发、形式化理论、软件开发方法学等。