条款1 视c++为一个语言联邦(如何理解c++)

如何理解c++? effective c++的第一条是这么说的:

今天的c++已经是个多重泛型编程语言, 一个同时支持过程形式(procedural)、面向对象式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。 

将c++视为一个由相关语言组成的联邦而非单一语言。在某个次语言(sublanguage)中,各种守则与通例都倾向简单、直观易懂、并且容易记住。然而当你从一个次语言移往另一个次语言, 守则可能改变。它的主要次语言总共有四个:

1. C

c++仍是以C为基础。 区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(build-in data types)、数组(arrays)、指针(pointers)等统统来自C。许多时候C++对问题的解法其实不过就是较高级的C解法, 但当你以C++内的C成分工作时, 高效编程守则映照出C语言的局限:没有模板(templates), 没有异常(exceptions), 没有重载(overloading)……

2. Object-Oriented C++

这部分也就是C with Classes所诉求的: classes(包括构造哈数和析构函数), 封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态 绑定)……等等。这一部分是面向对象设计之古典守则在C++
上的最直接实施。

3.Tempate C++

这是c++的泛型编程(generic programming)部分, 也是大多数程序员经验最少的部分。 Template相关考虑与设计已经弥漫整个c++, 良好编程守则中“惟template适用“的特殊条款并不罕见。实际上由于template威力强大,它们带来崭新的编程泛型(programming  paradigm),也就是所谓的template metaprogramming(TMP, 模板元编程)。

4.STL

STL是个template库, 看名称也只到, 但它是非常特殊的一个。它对容器(containers)、迭代器(iterators)、算法(algorithms)以及函数对象(function objects)的规约有极佳的紧密配合与协调, 然而templates及程序库也可以其他想法建制出来。

记住这四个语言, 当你从某个次语言切换到另一个, 导致高效编程守则要求你改变策略时,不要感到惊讶。例如对内置类型而言pass-by-value通常比pass-by-reference高效, 但当你从C part of c++移往Object-Oriented c++,由于用户自定义构造函数和析构函数的存在, pass-by-reference-cosnt往往更好。运用Template C++时尤其如此, 因此彼时你甚至不知道所处理的对象的类型。然而一旦跨入STL你就会了解, 迭代器和函数对象都是在C指针之上塑造出来的, 所以对STL的迭代器和函数对象而言, 旧式的C pass-by-value守则再次适用。

你可能感兴趣的:(effective,c++)