Loading

欢乐C++ —— 1. 从C到C++

参考:

https://www.modernescpp.com/index.php/objectoriented-generic-and-functional-programming

https://www.cnblogs.com/QG-whz/p/5132745.html

简介

在学C++ 之前,希望先对C++ 有个简单了解,它与C 有什么不同?现代C++ 有多了些什么?国外帖子总结很好,我这里就摘取其中的重点来看一看。

C 始于上世纪70年代初;1998年,第一个C++ 标准颁布;现代C++ 始于C++ 11。在三个阶段中,每一种代表着不同的解决问题的方法。在C语言中,依靠过程和结构;C++中的面向对象和泛型编程提供了进一步抽象;现代C++ 又提供了函数式编程。

ObjectOrientedGenericFunctional
面向对象

面向对象基于三个概念,封装,继承,多态:

  • 封装:对象封装它的属性和方法,而呈现出接口。也成为数据隐藏。
  • 继承:派生类取得基类的所有属性。也成为代码复用。
  • 多态:使不同数据类型呈现出相同接口的能力。

这带来两个好处:

  1. 我们更容易定义与其它类相似但不完全相同的新类。
  2. 在使用这些彼此相似的类时,我们一定程度上可以忽略一些它们间的区别。
泛型编程

泛型编程的关键思想在于函数模板和类模板。通过给定数据类型,你可以获得相应类型的函数或类。

泛型编程提供的抽象和面向对象有相似性,一个最大的不同是 面向对象多态发生在运行期,而 泛型多态发生在编译期。这也是为什么面向对象多态称为 动态多态 而泛型多态称为 静态多态

函数式编程

原版函数式编程篇幅太多,感兴趣可以自行阅读。

总结

在C++ 中:

  • 面向对象通过 继承 中虚函数动态绑定实现,可以呈现运行期多态,也称动态多态。

    • 优点
      1. OO设计中重要的特性,对客观世界直觉认识。
      2. 能够处理同一个继承体系下的异质类集合。
    • 缺点
      1. 运行期间进行虚函数绑定,提高了程序运行开销。
      2. 庞大的类继承层次,对接口的修改易影响类继承层次。
      3. 由于虚函数在运行期在确定,所以编译器无法对虚函数进行优化。
      4. 虚表指针增大了对象体积,类也多了一张虚函数表,当然,这是理所应当值得付出的资源消耗,列为缺点有点勉强。
  • 泛型编程通过 模板 来实现,可以呈现编译期多态,也称静态多态。

    • 优点

      1. 它带来了泛型编程的概念,使得C++拥有泛型编程与STL这样的强大武器。
      2. 在编译器完成多态,提高运行期效率。
      3. 具有很强的适配性与松耦合性,对于特殊类型可由模板偏特化、全特化来处理。
    • 缺点

      1. 程序可读性降低,代码调试带来困难。
      2. 无法实现模板的分离编译,当工程很大时,编译时间不可小觑。
      3. 无法处理异质对象集合。
posted @ 2019-12-29 21:12  沉云  阅读(188)  评论(0编辑  收藏  举报