欢乐C++ —— 1. 从C到C++
参考:
https://www.modernescpp.com/index.php/objectoriented-generic-and-functional-programming
简介
在学C++ 之前,希望先对C++ 有个简单了解,它与C 有什么不同?现代C++ 有多了些什么?国外帖子总结很好,我这里就摘取其中的重点来看一看。
C 始于上世纪70年代初;1998年,第一个C++ 标准颁布;现代C++ 始于C++ 11。在三个阶段中,每一种代表着不同的解决问题的方法。在C语言中,依靠过程和结构;C++中的面向对象和泛型编程提供了进一步抽象;现代C++ 又提供了函数式编程。
面向对象
面向对象基于三个概念,封装,继承,多态:
- 封装:对象封装它的属性和方法,而呈现出接口。也成为数据隐藏。
- 继承:派生类取得基类的所有属性。也成为代码复用。
- 多态:使不同数据类型呈现出相同接口的能力。
这带来两个好处:
- 我们更容易定义与其它类相似但不完全相同的新类。
- 在使用这些彼此相似的类时,我们一定程度上可以忽略一些它们间的区别。
泛型编程
泛型编程的关键思想在于函数模板和类模板。通过给定数据类型,你可以获得相应类型的函数或类。
泛型编程提供的抽象和面向对象有相似性,一个最大的不同是 面向对象多态发生在运行期,而 泛型多态发生在编译期。这也是为什么面向对象多态称为 动态多态 而泛型多态称为 静态多态 。
函数式编程
原版函数式编程篇幅太多,感兴趣可以自行阅读。
总结
在C++ 中:
-
面向对象通过 继承 中虚函数动态绑定实现,可以呈现运行期多态,也称动态多态。
- 优点
- OO设计中重要的特性,对客观世界直觉认识。
- 能够处理同一个继承体系下的异质类集合。
- 缺点
- 运行期间进行虚函数绑定,提高了程序运行开销。
- 庞大的类继承层次,对接口的修改易影响类继承层次。
- 由于虚函数在运行期在确定,所以编译器无法对虚函数进行优化。
- 虚表指针增大了对象体积,类也多了一张虚函数表,当然,这是理所应当值得付出的资源消耗,列为缺点有点勉强。
- 优点
-
泛型编程通过 模板 来实现,可以呈现编译期多态,也称静态多态。
-
优点
- 它带来了泛型编程的概念,使得C++拥有泛型编程与STL这样的强大武器。
- 在编译器完成多态,提高运行期效率。
- 具有很强的适配性与松耦合性,对于特殊类型可由模板偏特化、全特化来处理。
-
缺点
- 程序可读性降低,代码调试带来困难。
- 无法实现模板的分离编译,当工程很大时,编译时间不可小觑。
- 无法处理异质对象集合。
-