Item 1: View C++ as a federation of languages

最初,C++只是C语言加上一些面向对象的特性,所以C++的原名是“C with Classes”。 现在的C++已经逐渐成熟,成为一门多范式的程序设计语言(multiparadigm programming language)。同时支持过程式、面向对象、函数式、泛型编程,以及元编程。

C++的灵活使得它在很多问题上并没有统一的规则,而是取决于具体的程序设计范式和当前架构的设计意图。这样的情况下,我们最好把C++看做是一系列的编程语言,而非一种特定的编程语言。

C++有四种主要的子语言:

  • C。C++是基于C设计的,你可以只使用C++中C的那部分语法。此时你会发现你的程序反映的完全是C的特征:没有模板、没有异常、没有重载。
  • Object-Oriented C++。面向对象程序设计也是C++的设计初衷:构造与析构、封装与继承、多态、动态绑定的虚函数。
  • Template C++。这是C++的泛型编程部分,多数程序员很少涉及,但模板在很多情况下仍然很方便。另外模板元编程(template metaprogramming)也是一个新兴的程序设计范式,虽然有点非主流。
  • STL。这是一个特殊的模板库,它的容器、迭代器和算法优雅地结合在一起,只是在使用时你需要遵循它的程序设计惯例。当然你也可以基于其他想法来构建模板库。

总之C++并非单一的一门语言,它有很多不同的规则集。因而C++可以被视为四种主要子语言的集合,每个子语言都有自己的程序设计惯例。

C++程序设计的惯例并非一成不变,而是取决于你使用C++语言的哪一部分。例如, 在基于C语言的程序设计中,基本类型传参时传值比传引用更有效率。 然而当你接触Object-Oriented C++时会发现,传常量指针是更好的选择。 但是你如果又碰到了STL,其中的迭代器和函数对象都是基于C语言的指针而设计的, 这时又回到了原来的规则:传值比传引用更好。

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可,转载注明来源即可: https://harttle.land/2015/07/19/effective-cpp-1.html。如有疏漏、谬误、侵权请通过评论或 邮件 指出。