C++本来的名字叫C with Classes,也就是带有class的C语言,但是慢慢的其发展已经超越了原来的设定,不断的增加新的东西,虚函数(virtual function)、运算符重载(operator overloading)、多继承(multiple inheritance)、标准模板库(standard template library, STL)、异常处理(exception)、运行时类型信息(Runtime type information)、名字空间(namespace)等概念逐渐纳入标准,成为了一种多重泛型编程语言(multiparadigm programming language),现在的C++同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)和元编程形式(metaprogramming)的语言。

1998年,国际标准组织(ISO)颁布了C++程序设计语言的第一个国际标准ISO/IEC 14882:1998,当前最新标准为ISO/IEC 14882:2017。

C++学习之如何看待C++

 

因此我们要将C++看做是相关语言组成的联邦,在每个次语言中,其守则与通例都不同,因此在不同的次语言切换的时候需要考虑不同的规则,主要有以下4种:

1. C

区块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(bulit-in data types)、数组(arrays)、指针(pointers)等来自于C语言。

2. Object-Oriented C++

这一部分主要是面对对象设计,包括classes(包括构造和析构)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)...等等

3. Template C++

这是C++的泛型编程部分,这一部分大部分人经验很少,不过不用担心,其规则很少与主流编程相互影响

4. STL

STL是Template程序库,称为标准模板库。他对容器(container)、迭代器(iterator)、算法(algorithms)以及函数对象(function objects)有不同的规约,尽管他是Template程序库,但是有自己的办事特点,因此使用的时候一定要遵守。


 举一个例子,当我们将对象作为参数传递的时候,对于内置类型(int等也可以看成是一个对象)其属于C的范畴,pass-by-value通常比pass-by-reference更加有效。但当进入到 Object-Oriented C++中传递我们自定义的对象时,由于构造函数和析构函数的存在,pass-by-reference-to-const往往更有效(此时传递value其实是调用了对象的copy构造函数,参考图1)。采用Template C++也是如此,因为你都不知道彼时的对象类型。但是到对于STL,迭代器函数对象是在C指针上塑造出来的,所以对于STL的迭代器和函数对象而言,旧式的pass-by-value守则再次适用

C++学习之如何看待C++
图1

因此,C++的高效编程取决于你使用的是C++的哪一部分。 

参考: Efficient C++ (第三版) 

            维基百科 C++

 

相关文章: