# Preface(前言)
作者:[Scott Meyers](http://aristeia.com/)
译者:[fatalerror99 (iTePub's Nirvana)](mailto:fatalerror9999@hotmail.com?subject=Preface)
发布:[http://blog.csdn.net/fatalerror99/](http://blog.csdn.net/fatalerror99/)
我在 1991 年写出了 _Effective C++_ 的最早版本,1997 年出了第二版,我更新了一些重要的方面的素材,但是,因为我不想使熟悉本书第一版的读者感到困惑,我尽最大可能保持了原有的结构。最早的 50 个 Item 标题中的 48 个原则上保持不变。如果把书看作一栋房子,第二版就相当于通过更换地毯、涂料和灯光设备等使其焕然一新。
对于第三版,我打散了原有的秩序。(很多次我希望我能做得更彻底。)1991 年以来,C++ 世界经历了巨大的改变,而将近 15 年以前我制定的那些 Item 也不再契合本书的目标——将最重要的 C++ 编程准则融入小而易读的建议中。1991 年,假设 C++ 程序员具有 C 语言背景是有一定道理的。现在,转到 C++ 的程序员很可能来自 Java 或 C#。1991 年,inheritance(继承)和 object-oriented programming(面向对象编程)对于大多数程序员来说都是新鲜的。现在,这些已经是非常普遍的概念,而 exceptions(异常),templates(模板),以及 generic programming(泛型编程)成为新的需要更多指导的领域。1991 年,没有人听说过 design patterns(设计模式)。现在,讨论软件系统时很难不涉及它们。1991 年,C++ 正式标准化的工作刚刚开始。现在,标准化已经八年了,而下一个版本的工作也已经开始。
为应对这些变化,我尽己所能将写字板擦得一干二净,并不断地追问自己:“在 2005 年,对于目前的 C++ 程序员,什么才是最重要的建议?”结果就是这个新版本中的一组 Item。本书包括了关于 resource management(资源管理)和 programming with templates(使用模板编程)的新的章节。实际上,templates(模板)的考虑贯穿全书,因为它几乎影响了 C++ 的每个方面。本书也包括关于在 exceptions(异常)存在的场合下编程,在应用 design patterns(设计模式),以及在使用新的 TR1 库程序(TR1 在 Item 54 中介绍)等方面的新的素材。本书还承认在 single-threaded systems(单线程系统)中能很好地工作的技术和方法可能不适用于 multithreaded systems(多线程系统)。噢,本书超过一半的素材都是新的。然而,第二版中基本原理方面的资料中的大部分依然是重要的,所以我将它们以这样或那样的形式保留下来。(你能在 [Appendix B](http://blog.csdn.net/fatalerror99/archive/2006/02/16/600754.aspx)([附录 B](http://blog.csdn.net/fatalerror99/archive/2006/02/16/600754.aspx))找到第二版和第三版 Item 的对照表。)
我尽我所能使本书趋于最好,但我并不幻想完美。如果你觉得本书中的一些 Item 作为常规的建议不太合适;或者有更好的方法实现本书中需要完成的任务;或者有一个或更多技术上的讨论不明确,不完全,或容易令人误解,请告诉我。如果你发现任何错误——技术上的,文法上的,印刷上的,无论哪种——也请告诉我。如果你是第一个让我注意到某个问题的人,我很高兴将你的名字加入到以后再次印刷的致谢中。
即使 Item 的数量增加到 55,本书中的这一组准则离完满无遗还差得很远。但是成为好的规则——在几乎所有的应用程序几乎所有的时间中得到应用——比它看上去更加困难。如果你有增加准则的建议,我很高兴能听到它。
我维护本书从第一次印刷起的变化列表,包括错误修正,进一步解释,和技术更新。这个列表可以从 _Effective C++ Errata_ 网页得到,[http://aristeia.com/BookErrata/ec++3e-errata.html](http://aristeia.com/BookErrata/ec++3e-errata.html)。如果你希望当我更新列表时,你能得到通报,我建议你参加我的 mailing list(邮件列表)。我用它作为通告,发给那些对跟踪我的职业工作感兴趣的人们。关于细节问题,请参考 [http://aristeia.com/MailingList/](http://aristeia.com/MailingList/)。
SCOTT DOUGLAS MEYERS STAFFORD, OREGON
[http://aristeia.com/](http://aristeia.com/) APRIL 2005
- Preface(前言)
- Introduction(导言)
- Terminology(术语)
- Item 1: 将 C++ 视为 federation of languages(语言联合体)
- Item 2: 用 consts, enums 和 inlines 取代 #defines
- Item 3: 只要可能就用 const
- Item 4: 确保 objects(对象)在使用前被初始化
- Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数
- Item 6: 如果你不想使用 compiler-generated functions(编译器生成函数),就明确拒绝
- Item 7: 在 polymorphic base classes(多态基类)中将 destructors(析构函数)声明为 virtual(虚拟)
- Item 8: 防止因为 exceptions(异常)而离开 destructors(析构函数)
- Item 9: 绝不要在 construction(构造)或 destruction(析构)期间调用 virtual functions(虚拟函数)
- Item 10: 让 assignment operators(赋值运算符)返回一个 reference to *this(引向 *this 的引用)
- Item 11: 在 operator= 中处理 assignment to self(自赋值)
- Item 12: 拷贝一个对象的所有组成部分
- Item 13: 使用对象管理资源
- Item 14: 谨慎考虑资源管理类的拷贝行为
- Item 15: 在资源管理类中准备访问裸资源(raw resources)
- Item 16: 使用相同形式的 new 和 delete
- Item 17: 在一个独立的语句中将 new 出来的对象存入智能指针
- Item 18: 使接口易于正确使用,而难以错误使用
- Item 19: 视类设计为类型设计
- Item 20: 用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值)
- Item 21: 当你必须返回一个对象时不要试图返回一个引用
- Item 22: 将数据成员声明为 private
- Item 23: 用非成员非友元函数取代成员函数
- Item 24: 当类型转换应该用于所有参数时,声明为非成员函数
- Item 25: 考虑支持不抛异常的 swap
- Item 26: 只要有可能就推迟变量定义
- Item 27: 将强制转型减到最少
- Item 28: 避免返回对象内部构件的“句柄”
- Item 29: 争取异常安全(exception-safe)的代码
- Item 30: 理解 inline 化的介入和排除
- Item 31: 最小化文件之间的编译依赖
- Item 32: 确保 public inheritance 模拟 "is-a"
- Item 33: 避免覆盖(hiding)“通过继承得到的名字”
- Item 34: 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继承)
- Item 35: 考虑可选的 virtual functions(虚拟函数)的替代方法
- Item 36: 绝不要重定义一个 inherited non-virtual function(通过继承得到的非虚拟函数)
- Item 37: 绝不要重定义一个函数的 inherited default parameter value(通过继承得到的缺省参数值)
- Item 38: 通过 composition(复合)模拟 "has-a"(有一个)或 "is-implemented-in-terms-of"(是根据……实现的)
- Item 39: 谨慎使用 private inheritance(私有继承)
- Item 40: 谨慎使用 multiple inheritance(多继承)
- Item 41: 理解 implicit interfaces(隐式接口)和 compile-time polymorphism(编译期多态)
- Item 42: 理解 typename 的两个含义
- Item 43: 了解如何访问 templatized base classes(模板化基类)中的名字
- Item 44: 从 templates(模板)中分离出 parameter-independent(参数无关)的代码
- Item 45: 用 member function templates(成员函数模板) 接受 "all compatible types"(“所有兼容类型”)
- Item 46: 需要 type conversions(类型转换)时在 templates(模板)内定义 non-member functions(非成员函数)
- Item 47: 为类型信息使用 traits classes(特征类)
- Item 48: 感受 template metaprogramming(模板元编程)
- Item 49: 了解 new-handler 的行为
- Item 50: 领会何时替换 new 和 delete 才有意义
- Item 51: 编写 new 和 delete 时要遵守惯例
- Item 52: 如果编写了 placement new,就要编写 placement delete
- 附录 A. 超越 Effective C++
- 附录 B. 第二和第三版之间的 Item 映射