[Herb Sutter 的名作More Exceptional C++中文版即将出版。作为本书译者,我很高兴将本书推荐给大家。征得华中科技大学出版社同意,我将公开部分译稿,敬请大家批评指正。]
小提琴家穆特录制过一张唱片,收录的是贝多芬最伟大的两部小提琴作品1。聆听那张唱片,你仿佛听见贝多芬在向你倾诉他对音乐艺术的理解和感悟、为你解答小提琴音乐创作的每一个疑问和困惑。为了向音乐爱好者推荐贝多芬的那两部名作,穆特为她的那张名碟加上了一个恰如其分的标题——“与贝多芬面对面”。
合上More Exceptional C++的瞬间,我的第一反应是为这部名作也加上一个与之类似的副题,然后,郑重地推荐给你。
是的,本书奉献给你的是又一位大师苦心孤诣的结晶。不同的是,这位大师来自你所关注的C++程序设计领域。对每一位C++爱好者或C++专业程序员来说,Herb Sutter的名字应该不会让人感到陌生。作为ISO/ANSI C++标准委员会的委员,Herb Sutter不仅是C++程序设计领域公认的专家,还是深受程序员喜爱的技术讲师和作家。Herb Sutter在互联网上主持的Guru of the Week专栏广受欢迎,几乎成为每一位C++程序员的网上必读。本书就是Guru of the Week的最新总结和精华。
本书的主要特点可以反映在我为它所加的副题中。作为身经百战的专业程序员,而且长期从事程序设计的普及教育工作,Herb Sutter最清楚程序员在提升技术功力的过程中的所想和所为。他既了解初学者的疑问和困惑,也对专业程序员日常工作中遭遇的陷阱和易犯错误了如指掌。因而,在本书中,Herb Sutter采用了独具匠心的“提问/解答”的方式来指导你学习C++的语言特性;在本书的每个专题中,Herb Sutter合理地设想出你的疑问和困惑,又有如神助地猜到了你的(可能是错误的)解答,然后给你以指点并呈现出最佳方案,最后,还提炼出解决类似问题的一般性原则。读了这本书,你仿佛和Herb Sutter这位大师面对面地进行了一场对话,亲历了他对你的指导和点拨。
关于本书的另一个特点,我想指出的是,作为C++标准委员会的委员,Herb Sutter在本书中强调了C++语言的最新标准和最新特性,强调了泛型程序设计和标准库的使用。在本书的所有示例中,Herb Sutter为我们提供的是清新的C++编程风格和纯正的现代C++代码和范例。
__________________
1. 确切地说,这是一套双CD专辑,收录的是贝多芬的D大调小提琴协奏曲和C大调“三重奏”协奏曲。
本书适合的读者对象是中高级程序员,但这并不说本书的内容高不可攀。作者并不是在讲述高深的语言特性和设计技巧,更没有对基础话题避而不谈;相反,有关基础知识的介绍、回顾和深化散见于本书的很多条款之中。只不过,这些条款的内容涉及的只是C++特性中的细节,它没有对C++的每一个特性、或每个特性中的每一个方面作全面的介绍。尽管如此,只要具备基本的C++功底和一定的程序设计经验,你完全可以理解和消化本书的所有内容。由于作者巧妙的组织和精心的选材,本书每一个条款的内容都独立而完整,它让你在深入学习C++语言特性时事半功倍。
因而,我相信,无论是有一定基础的C++爱好者,还是身经百战的专业程序员,本书都会为你带来收获;在你的C++程序设计生涯中,它是你的案头不可或缺的C++专著之一。
致谢
[略]
於春景
深圳蛇口,2002年4月
序 |
vii |
|
ix |
前言 |
|
|
|
泛型程序设计与C++标准库 |
1 |
条款1:流 |
1 |
条款2:Predicates,之一:remove()删除了什么? |
6 |
条款3:Predicates,之二:状态带来的问题 |
11 |
条款4:可扩充的模板:使用继承还是traits? |
19 |
条款5:typename |
32 |
条款6:容器、指针和“不是容器的容器” |
36 |
条款7:使用vector和deque |
46 |
条款8:使用set和map |
53 |
条款9:等同的代码吗? |
59 |
条款10:模板特殊化与重载 |
64 |
条款11:Mastermind |
69 |
|
|
优化与性能 |
83 |
条款12:内联 |
83 |
条款13:缓式优化,之一:一个普通的旧式String |
86 |
条款14:缓式优化,之二:引入缓式优化 |
90 |
条款15:缓式优化,之三:迭代器与引用 |
94 |
条款16:缓式优化,之四:多线程环境 |
103 |
|
|
异常安全议题及技术 |
115 |
条款17:构造函数失败,之一:对象生命期 |
115 |
条款18:构造函数失败,之二:吸收异常? |
119 |
条款19:未捕获的异常 |
126 |
条款20:未管理指针存在的问题,之一:参数求值 |
132 |
条款21:未管理指针存在的问题,之二:使用auto_ptr? |
135 |
条款22:异常安全与类的设计,之一:拷贝赋值 |
141 |
条款23:异常安全与类的设计,之二:继承 |
149 |
|
|
继承与多态 |
155 |
条款24:为什么使用多继承? |
155 |
条款25:模拟多继承 |
159 |
条款26:多继承与连体双婴问题 |
162 |
条款27:(非)纯虚函数 |
167 |
条款28:受控的多态 |
172 |
|
|
内存及资源管理 |
175 |
条款29:使用auto_ptr |
175 |
条款30:智能指针成员,之一:auto_ptr存在的问题 |
182 |
条款31:智能指针成员,之二:设计ValuePtr |
187 |
|
|
自由函数与宏 |
201 |
条款32:递归声明 |
201 |
条款33:模拟嵌套函数 |
206 |
条款34:预处理宏 |
215 |
条款35:宏定义 |
218 |
|
|
杂项议题 |
223 |
条款36:初始化 |
223 |
条款37:前置声明 |
226 |
条款38:typedef |
228 |
条款39:名字空间,之一:using声明与using指令 |
231 |
条款40:名字空间,之二:迁徙到名字空间 |
234 |
|
|
后记 |
245 |
|
|
附录A:(在多线程环境下)并非优化 |
247 |
附录B:单线程String实现与多线程安全String实现的对比测试结果 |
263 |
|
|
参考文献 |
271 |
|
|
索引 |
273 | 
|