# Introduction(导言)
作者:Scott Meyers
译者:fatalerror99 (iTePub's Nirvana)
发布:http://blog.csdn.net/fatalerror99/
学习一种编程语言的基础是一回事;学习如何用那种语言设计和实现高效率的程序完全是另外一回事。对于 C++ ——一种以拥有非同寻常的能力范围和表现力而自豪的语言——更是尤其如此。如果能正确使用,与 C++ 共事是一件令人快乐的事情。极多样的设计样式被直接表达并有效实现。对于 classes(类),functions(函数),以及 templates(模板)的明智选择和小心精巧的安排能使应用程序的编程更加简单,直观,高效,并基本无错。如果你知道如何去做,写出高效的 C++ 程序并不特别难。然而,如果不经训练就贸然使用,C++ 也会导致不可理解的,难以维护的,无法扩展的,低效率的,错误百出的代码。
本书的目的在于引导你如何高效使用 C++。我假设你已经熟悉了作为语言的 C++ 并有使用它的一些经验。我在此提供的是使用这种语言的指南,以使你的程序易于理解,可维护,易移植,可扩展,效率高,而且行为符合你的预期。
我提供的建议落在两个主要的范围中:普通的设计策略,以及特殊语言特性的具体细节。设计的讨论集中于如何在 C++ 做某件事情的多种不同方法之间进行选择。如何在 inheritance(继承)和 templates(模板)之间选择?如何在 public(公有)和 private inheritance(私有继承)之间选择?如何在 private inheritance(私有继承)和 composition(复合)之间选择?如何在 member(成员)和 non-member functions(非成员函数)之间选择?如何在 pass-by-value(传值)和 pass-by-reference(传引用)之间选择?在一开始就做出正确的决定是很重要的,因为一个不好的选择可能会直到开发过程很晚的阶段才显现出来,在这时候再调整它常常是困难重重,极为耗时而且代价不菲的。
即使在你正确地知道你要做什么的时候,仅仅把事情做对也是需要技巧的。assignment operators(赋值运算符)的合适的返回类型是什么?destructor(析构函数)什么时候应该是 virtual(虚拟)的?当 operator new(运算符 new)找不到足够的内存时它应该怎么办?类似这些的令人费神的细节是至关重要的,因为错误的做法几乎总是导致无法预料的,很可能令人迷惑的程序行为。这本书正是来帮助你避免这些问题的。
这不是一本全面的 C++ 手册。它收集了 55 个详细的提议(我将它们称为 Items)告诉你怎样才能改善你的程序和设计。每一个 Item 都能 stands more or less on its own(独立成章),但大部分也包含对其它 Items 的参考。因而,读这本书的一个方法就是从你感兴趣的一个 Item 开始,然后顺着它的参考条目继续看下去。
这本书也不是一本 C++ 入门书。例如,在 Chapter 2(第二章),我希望能告诉你关于 constructors(构造函数),destructors(析构函数),以及 assignment operators(赋值运算符)正确实现的全部内容,但是我假设你已经知道或者能在别处找到这些函数做些什么以及它们该怎样声明的资料。大量 C++ 书籍包含类似这样的信息。
这本书的目的是为了突出 C++ 编程中那些常常被忽略的方面。其它书描述了语言的各个部分。这本书则告诉你如何将这些部分结合起来以达到高效编程的最终目的。其它书告诉你如何使你的程序能够编译。这本书则告诉你如何避免那些编译器不能告诉你的问题。
与此同时,本书将自己限制在 standard C++(标准 C++)之内。在此仅仅使用官方的语言标准中的特性。可移植性是本书一个关键的关注点,所以如果你要寻找平台依赖的特性和部件,在这里不会找到。
另一个在本书中找不到的东西是 C++ Gospel(C++ 福音书)——通向完美的 C++ 软件的一条 One True Path(真理之路)。本书中的每一个 Item 都在如何生成更好的设计,如何避免一般的问题,以及如何得到更高的效率等方面提供指导,但没有一个 Item 是普遍适用的。软件设计和实现是一项复杂的任务,被 hardware(硬件),operating system(操作系统),和 application(应用程序)的限制所影响,所以我能做的最好的事情就是为创建更好的程序提供 guidelines(指导方针)。
如果你在所有的时候都遵守这些 guidelines(指导方针),你将不太可能落入环绕在 C++ 周围的大量陷阱中,但是作为 guidelines(指导方针)的固有限制,它总有例外。这就是为什么每一个 Item 都有一个详细的解释。这些解释是本书中最重要的部分。只有理解了一个 Item 背后的基本原理,你才能决定它是否适合你开发的软件以及你被困其下的特有的限制。
本书最好用来增加关于 C++ 如何运转,为什么它会这样运转,以及如何让它的行为为你服务等方面的知识。盲目运用本书的 Items 无疑是不适当的,但是与此同时,如果你没有更好的理由,或许也不应该违反这些 guidelines(指导方针)中的任何一条。
- 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 映射