条款01:视C++为一个语言联邦


C++最初只是在C的基础上添加一些面向对象特性,即C with Classes。但是随着时间的推移,C++开始接受各种观念,特性和编程战略。Exceptions对函数的结构化带来不同的做法(条款29),templates带来新的设计思考方式(条款41),STL定义了一个前所未见的伸展性做法。

今天的C++已经是个多重范型编程语言,一个同时支持过程形式,面向对象形式,函数形式,泛型形式,元编程形式的语言。这些使得C++成为一个无可匹敌的工具,但也会让它显得臃肿,无法理解,甚至不知道该做什么。

简单的做法是将C++视为一个语言联邦,在其某个次语言(sublanguage)中,都有其守则与通例。当从一个次语言变到另一个次语言时,守则可能改变。幸运的是,C++的主要次语言有四个:

  • C。C++终究是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针等统统来自C。许多时候C++对问题的解法其实不过是较高级的C解法(例如用对象管理资源),但是以C部分工作时,将体现出C的局限:没有模板,没有异常,没有重载…
  • Object-Oriented C++。这部分就是C with Classes需要的:classes,封装,继承,多态,动态绑定等等。
  • Template C++。这是C++中泛型编程的部分。由于templates威力强大,它们带来了崭新的编程范型,也就是所谓的template metaprogramming(TMP,模板元编程)。
  • STL。STL是个template程序库。它对容器,迭代器,算法以及函数对象的规约有极佳的配合与协调。

因为这些次语言,当从某个此语言切换到另一个,导致高效编程守则要求改变策略时,不要感到惊讶。例如对内置类型而言pass-by-value通常比pass-by-reference高效。

因此,C++高效编程守则视状况而变化,这取决于使用C++的哪一部分。