今天的c++是一种多范式的编程语言,它支持过程式、面向对象、函数式、泛型和元编程特性的组合。这种强大的功能和灵活性使c++成为无与伦比的工具,但也会引起一些混乱。所有的“正确使用”规则似乎也有例外。我们如何理解这样一种语言呢?
最简单的方法是不要将c++视为一种单一的语言,而是将其视为相关语言的联合。在特定的子语言中,规则往往简单、直接且易于记忆。要理解c++,你必须认识它的主要子语言,共四种:
- C:在深层次上,c++仍然是基于C的。块、语句、预处理器、内置数据类型、数组、指针等都来自C。在很多情况下,c++提供的解决问题的方法优于C,但在使用c++的C部分时,会体现出一定的局限性:没有模板,没有异常,没有重载,等等。
- 面向对象的c++:c++的这一部分就是C with Classes的全部内容:类(包括构造函数和析构函数)、封装、继承、多态性、虚函数(动态绑定)等等。这是c++中最直接应用面向对象设计的经典规则的部分。
- c++模板:这是c++的泛型编程部分,也是大多数程序员经验最少的部分。模板在c++中随处可见,优秀的编程规则中包含特殊的模板子句并不罕见。模板是如此强大,它们产生了一种全新的编程范式,模板元编程(TMP)。TMP的规则很少与主流c++编程交互。
- STL:STL是一个模板库,但它是一个非常特殊的模板库。它关于容器、迭代器、算法和函数对象的约定完美地结合在一起,但模板和库也可以围绕其他思想构建。STL有特定的做事方式,当使用STL时,需要确保遵循它的约定。
c++并不是一种具有单一规则集的统一语言;它是四个子语言的联盟,每一个子语言都有自己的约定。请记住这四种子语言,当遇到高效的编程需要在从一种子语言切换到另一种子语言时改变策略的情况时,不要感到惊讶。
例:
对于内置(即类C)类型,值传递通常比引用传递更有效,但是当从c++的C部分转移到面向对象的c++时,用户定义的构造函数和析构函数的存在意味着pass-by-referenceto-const通常更好。尤其使用c++模板时,因为此时,你甚至不知道对象的类型。
然而,STL中的迭代器和函数对象是基于C指针的,因此对于STL中的迭代器和函数对象,旧的C值传递规则再次应用。