今天的C++已经是一个多重范型编程语言(multiparadigm programing language),同时支持过程形式(procedural),面向对象形式(object-oriented),函数形式(functional),泛型形式(generic),元编程形式(metaprogramming)的语言,这些能力和弹性使得C++成为一个无可匹敌的工具,但也可能引发疑惑:所有用法似乎都有例外,我们该如何理解这样一个语言呢?
最简单的方法是视C++为由相关语言组成的一个语言联邦,在其某个次语言中,各种守则与通例都倾向简单,直观易懂,容易记住。而当你从一个次语言转向另一个次语言,守则可能改变。为了理解C++,你必须认识其中4个主要的次语言:
1.C。
说到底C++是以C为基础的,区块,语句,预处理器,内置数据类型,数组,指针等,统统来自于C。很多时候C++对问题的解法不过就是高级点的C解法。但当你以C++内的C成分工作时,高效编程守则映照出C的局限:没有模板,没有重载,没有异常……
2.Object-Oriented C++。
这部分也就是C with Classes所诉求的:Classes(包括构造函数和析构函数),封装,继承,多态,虚函数(动态绑定)……等等,这一部分是面向对象设计在C++上的最直接实现。
3.Template C++
这是C++的泛型编程部分,也是大多数程序员经验最少的部分。Template相关考虑和设计已经弥漫整个C++,良好编程守则中“唯template适用”的特殊条款并不罕见。
4.STL
STL是个template程序库,看名称也知道,它是非常特殊的一个。它对容器,迭代器,算法,以及函数对象的规约有极佳的紧密配合与协调。
记住这四个次语言,当你从一个次语言切换到另一个,导致高效编程守则要求你改变策略时,不要感到惊讶。例如对内置类型来说 “pass by value”通常比“pass by reference”高效,但当你从C part of C++移往Object-Oriented C++,由于用户自定义构造函数和析构函数的存在,pass by reference to const往往更好。运用template时尤其如此,因为那时程序甚至不知道所处理对象的类型。然而一跨入STL你就会了解,迭代器和函数对象都是建立在C指针之上,所以对STL的迭代器和函数对象而言,pass by value守则再次适用。
因此,C++并不是一个带有一组守则的一体语言:它是四个次语言组成的联邦政府,每个次语言都有自己的规约。记住这四个语言就会发现C++容易了解的多。