Effective C++ 条款1 视C++为一个语言联邦
1. 一开始,C++只是C加上一些面向对象特性,最初名称为"C with Classes"(带类的C).
2. 如今的C++已经是个多重泛型编程语言,同时支持过程形式(procedural),面向对象形式(object-oriented),函数形式(functional),泛型形式(generic),元编程形式(metaprogramming)的语言.这些能力和弹性可能引发某些迷惑:所有"适当用法"似乎都有例外,该如何理解这样一个语言呢?
3. 最简单的方法是将C++视为一个由相关语言组成的联邦.在其某个次语言中,各种守则简单易懂,容易记住.但当从一个次语言迁往另一个次语言,守则可能改变.C++的次语言总共有四个:
C: C++以C为基础.区块(blocks),语句(statements),预处理器(proprocessor),内置数据类型(built-in data types),数组(arrays),指针(pointers)等统统来自C,许多C++对问题的解法其实不过是较高级的C解法.
Obiect-Oriented C++: 这部分是"C with Classes"所诉求的:classes(包括构造函数和析构函数),封装(encapsulation),继承(inheritance),多态(polymorphism),虚函数(动态绑定)...等等,这一部分是面向对象在C++上的直接实施.
Template C++: 这是C++的泛型编程(generic programming)部分,由于templates威力强大,它们带来崭新的变成范型(programming paradigm),也就是所谓的template meta-programmingTMP,模板元编程).
STL(标准模板库):它包括容器(containers),迭代器(iterators),算法(algorithms)以及函数对象(function objects).
4. 当从某个次语言切换到另一个时,高效编程守则可能要改变策略,例如对于内置类型(C-like)而言pass-by-value比pass-by-reference要高效(pass-by-value更占内存,而pass-by-value经过了对指针的一层封装更占时间),但当从C part of C++迁往Obiect-Oriented C++时,由于用户自定义构造函数和析构函数的存在,pass-by-reference显然比pass-by-value效率更高,运用template时尤其如此,因为所处理对象的类型甚至不都不确定,然而一旦跨入STL,对于迭代器和函数对象而言,旧式的C pass-by-value守则再次适用(因为迭代器和函数对象都是在C指针之上塑造出来的).
5. 综上,C++由四个次语言组成,每个次语言都有自己的规约,使用不同的次语言时C++的高效编程守则也发生变化.