一开始,C++只是C加上一些面向对象特性。C++最初的名称C with class
也反映了这一点。
但是当这个语言逐渐成熟,它变得更活跃更无拘束,开始接受各种新观念、新特性和新的编程战略。异常(exception)
对结构化程序引入了不同的做法,而模板(template)
为我们带来了新的思考方式。
今天的C++已经是个多重范型编程语言,一个同时支持面向过程、面向对象、模板、模板元编程的语言。这些能力和弹性使得C++已经成为了一个无可匹敌的工具,但也可能会引发某种疑惑:所有的“适当”用法似乎都存在意外情况。
一个最简单的处理方式是将C++视为一个由相关语言组成的联邦(而非是一种单一的语言)。在其中的某个“子语言”当中,各种守则和用例都很好理解,但是当在它们中间切换,或者需要组合使用这些特性时,可能存在问题。所以,务必要认识清楚各个“子语言”的设计概念和相关原则:
- 面向过程的部分(C语言)。说到底C++仍然是以C语言的语法特性为基础的。代码块、语句、预处理器、内置数据类型、数组、指针等基本语言元素统统来自C语言。许多时候C++对问题的解法实际上就是一种相对高级的C解法。
- 面向对象的部分。这部分也就是
C with class
所诉求的:封装、继承、多态、动态绑定等特性。 - 模板的部分。C++代码当中可能充斥着各种模板。C++模板的功能过于强大,以至于它为我们带来了新的编程范型。
STL
的部分。STL
是一个模板程序库,它对容器、迭代器、算法和函数对象有着特殊的规范和约定。当你需要伙同STL
一起工作时,必须要遵守它的规约以避免给自己带来麻烦。
记住这四个“子语言”,因为当在它们中间切换时,存在很多的注意事项。例如,当使用面向过程的部分时,传递值往往会比传递指针要高效;但是当切换到面向对象的部分时,由于构造函数和析构函数的存在,传递const引用
往往会更加高效;然而当再次跨入STL
的部分中时,你会发现迭代器希望你能够进行值传递。
【注意】C++编程方式会根据上下文而发生变化,取决于你使用它的哪一部分。