条款01:视C++为一个语言联邦
View C++ as a federation of language
C和C++,是相互联系的。
C++最初的名字就是C with Classes。
而如今,C++已经是多重泛型编程语言了,同时支持:
- 过程形式
- 面向对象形式
- 函数形式
- 泛型形式
- 元编程形式
而最便捷的理解方式,就是将其视为由相关语言组成的联邦而非单一语言。
在这样的一个语言联邦中,主要分为以下四种次语言:
1. C
因为C++说到底还是以C为基础的。许多时候C++对于问题的解法只不过是C的高级解法。但是当你以C++内的C成分进行工作时就会发现,C语言还是有这诸多的局限性:没有模板(template)、没有异常(exception)、没有重载(overloading)等等。
2. Object-Oriented C++
面向对象。这也是C with classes所诉求的:classes(包含构造函数与析构函数)、封装、继承、多态、virtual函数(动态绑定) 等等。这些是面向对象的思想在C上的实现。
3. Template C++
这部分所指的是C++的泛型编程。template带来了一种新的编程泛型——template metaprogramming(TMP,模板元编程)
4. STL
STL是template程序库,Standard Template Library的简称,中文名标准模板库。它对于容器(containers)、迭代器(iterators)、算法以及函数对象的规约有非常紧密的配合与协调。
当我们从一个次语言转换到另一个次语言时,高效编程的要求也会有一定的转变。
例如,对于内置(C-like)类型而言:
- pass-by-value(传值)通常比pass-by-reference(传引用) 更为高效;
但是,当从C part of C++移到Object-Oriented C++ 时:
- 由于用户自定义的构造函数和析构函数的存在,使用pass-by-reference-const往往更为高效。
再比如,对于STL,迭代器和函数对象都是在C指针之上塑造的,因此对于STL的迭代器和函数对象而言,C中的pass-by-value也是适用的。
小结:
C++高效编程守则是状况而变化,取决于你使用C++的哪一部分。