Item 1: 将 C++ 视为 federation of languages(语言联合体)

作者:Scott Meyers

译者:fatalerror99 (iTePub's Nirvana)

发布:http://blog.csdn.net/fatalerror99/

最初,C++ 仅仅是在 C 的基础上附加了一些 object-oriented(面向对象)的特性。C++ 最初的名称—— "C with Classes" 就非常直观地表现了这一点。

作为一个语言的成熟过程,C++ 的成长大胆而充满冒险,它吸收的思想,特性,以至于编程策略与 C with Classes 越来越不同。exceptions(异常)要求不同的建构功能的途径(参见 Item 29),templates(模板)将设计思想提升到新的高度(参见 Item 41),而 STL 定义了一条前所未见的通向扩展性的道路。

今天的 C++ 已经成为一个 multiparadigm programming language(多范式的编程语言),一个囊括了 procedural(过程化),object-oriented(面向对象),functional(函数化),generic(泛型)以及 metaprogramming(元编程)特性的联合体。这些能力和弹性使 C++ 成为无可匹敌的工具,但也引起了一些混乱。所有的 "proper usage"(惯用法)规则似乎都有例外。我们该如何认识这样一个语言?

最简单的方法是不要将 C++ 视为一个单一的语言,而是一个亲族的语言的 federation(联合体)。在每一个特定的 sublanguage(子语言)中,它的特性趋向于直截了当,简单易记。但你从一个 sublanguage(子语言)转到另外一个,它的规则也许会发生变化。为了感受 C++,你必须将它的主要的 sublanguages(子语言)组织到一起。幸运的是,它只有 4 个:

  • C ——归根结底,C++ 依然是基于 C 的。blocks(模块),statements(语句),preprocessor(预处理器),built-in data types(内建数据类型),arrays(数组),pointers(指针)等等,全都来自于 C。在很多方面。C++ 提出了比相应的 C 版本更高级的解决问题的方法(例如,参见 Item 2(选择 preprocessor(预处理器))和 13(使用 objects(对象)管理 resources(资源))),但是,当你发现你自己工作在 C++ 的 C 部分时,effective programming(高效编程)的规则表现了 C 的诸多限制范围:没有 templates(模板),没有 exceptions(异常),没有 overloading(重载)等等。

  • Object-Oriented C++ —— C++ 的这部分就是 C with Classes 涉及到的全部:classes(类)(包括构造函数和析构函数),encapsulation(封装),inheritance(继承),polymorphism(多态),virtual functions (dynamic binding)(虚拟函数(动态绑定))等。C++ 的这一部分直接适用于 object-oriented design(面向对象设计)的经典规则。

  • Template C++ ——这是 C++ 的 generic programming(泛型编程)部分,大多数程序员对此都缺乏经验。template(模板)的考虑已遍及 C++,而且好的编程规则中包含特殊的 template-only(模板专用)条款已不再不同寻常(参见 Item 46 通过调用 template functions(模板函数)简化 type conversions(类型转换))。实际上,templates(模板)极为强大,它提供了一种全新的 programming paradigm(编程范式)—— template metaprogramming (TMP) (模板元编程)。Item 48 提供了一个 TMP 的概述,但是,除非你是一个 hard-core template junkie(死心塌地的模板瘾君子),否则你不需在此费心,TMP 的规则对主流的 C++ 编程少有影响。

  • STL —— STL 是一个 template library(模板库),但它一个非常特殊的 template library(模板库)。它将 containers(容器),iterators(迭代器),algorithms(算法)和 function objects(函数对象)非常优雅地整合在一起,但是。templates(模板)和 libraries(库)也可以围绕其它的想法建立起来。STL 有很多独特的处事方法,当你和 STL 一起工作,你需要遵循它的规则。

在头脑中保持这四种 sublanguages(子语言),当你从一种 sublanguage(子语言)转到另一种时,为了高效编程你需要改变你的策略,不要吃惊你遭遇到的情景。例如,使用 built-in(内建)(也就是说,C-like(类 C 的))类型时,pass-by-value(传值)通常比 pass-by-reference(传引用)更高效,但是当你从 C++ 的 C 部分转到 Object-Oriented C++(面向对象 C++),user-defined constructors(用户自定义构造函数)和 destructors(析构函数)意味着,通常情况下,更好的做法是 pass-by-reference-to-const(传引用给 const)。在 Template C++ 中工作时,这一点更加重要,因为,在这种情况下,你甚至不知道你的操作涉及到的 object(对象)的类型。然而,当你进入 STL,你知道 iterators(迭代器)和 function objects(函数对象)以 C 的 pointers(指针)为原型,对于 STL 中的 iterators(迭代器)和 function objects(函数对象),古老的 C 中的 pass-by-value(传值)规则又重新生效。(关于选择 parameter-passing(参数传递)方式的全部细节,参见 Item 20。)

C++ 不是使用一套规则的单一语言,而是 federation of four sublanguages(四种子语言的联合体),每一种都有各自的规则。在头脑中保持这些 sublanguages(子语言),你会发现对 C++ 的理解会容易得多。

Things to Remember

  • effective C++ programming(高效 C++ 编程)规则的变化,依赖于你使用 C++ 的哪一个部分。