C++被视为一个语言联邦
- 1. C
- 2. Objcet-Orienred C++
- 3. Template C++
- 4. STL标准库
不论你的编程背景是什么,你应该将C++视为一个由相关语言组成的联邦而非单一语言,在其某个次语言中(sublanguage)各种守则与通例都倾向简单,直观易懂,并且容易记住,然而当你从另一个次语言切换至另一个次语言时,守则可能改变,为了理解C++你必须认识其主要的次语言,幸运的是总共只有4个。
1. C
C++说到底是以C为基础。
💚💚
区块(blocks),语句(statements),预处理器(preprocessor),内置数据类型(built-in data types),数组(arrays), 指针(pointers)等统统来自C。许多时候C++对问题的解法其实不过就是较高级的C解法,但当你你以C++内的C成分工作时,高效编程守则映射出C语言的局限:没有模板(templates), 没有异常(exception),没有重载(overloading)。
2. Objcet-Orienred C++
这部分是 C with Classes所诉求的:classes(构造函数和析构函数),封装(encapsulation),继承(inheritance),多态(polymorphism),virtual虚函数,动态绑定…等等。 这一部分是面向对象设计在C++上的直接体现。
3. Template C++
这是C++的泛型编程基础(generic programing)部分,也是大多数程序员经验最少的部分。Template相关考虑与设计已经充满整个C++。
实际上由于 Template威力强大,他们带来崭新的编程规范(programming paradigm),也就是所谓的 template metaprogramming(TMP 模板元编程)
4. STL标准库
STL是个 template 程序块,看名称也知道,但它是非常特殊的一个,它对容器(containers),迭代器(iterator),算法(algorithms)以及函数对象(function objects)的规约有极佳的紧密配合与协调,然后 templates及程序库也可以其他方法建置出来,STL有自己特殊的办事方式,当你伙同 STL一起工作时,你必须遵守他们的规约。
💚💚
所以记住上面四个次语言,当你从某个次语言切换到另一个次语言,导致高效编程守则要求你改变策略时,不要感到惊讶。
例如:
- 对内置类型(也就是 C-like)类型而言 pass-by-value 通常比 pass-by-reference 更高效,
- 但是当你从 C part of C++ 迁移到 Object-Oriented C++ 由于用户自定义(user-defined)构造函数和析构函数存在,pass-by-reference 往往更好,运用 Template C++ 尤其如此。
- 但是你一旦跨入 STL 你就会了解 迭代器和阿含糊对象都是 C指针之上塑造出来的,所以 STL的迭代器和函数对象,旧式的 C pass-by-value守则更适用