768 字
4 分钟
C语言面向对象编程
既然都面向对象了,为什么不用C++?
我c艹太菜了() - 在嵌入式领域,C++没啥必要
by: Noir - C++高级特性太复杂,学习成本高,难以熟练掌握,相反C可以在更短的时间内到达更高的水平
- C语言使用者基数更大,在嵌入式领域使用范围更广(Linux内核即使用C语言面向对象设计)
什么是面向对象编程?
有这么一个公式:程序=数据结构+算法。
C语言面向过程编程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步调用,在函数中对数据结构进行处理(执行算法),也就是说数据结构和算法是分开的。
而C语言面向对象编程是把数据和算法封装在一起,形成一个整体,无论是对它的属性进行操作、还是对它的行为进行调用,都是通过一个对象来执行,这就是面向对象编程思想。
面向对象对比C语言传统的面向过程有什么优势?
- 强制绑定数据和行为,隐藏实现细节:上层只调用行为,不直接操作数据,不需要了解数据结构,更简单。同时行为与数据绑定,只暴露部分数据,更安全。
- 接口统一:改变硬件时只需要改变函数指针指向不同的实现,上层调用接口不动,如linux一切皆文件。
- 添加新组件只需要新建结构体,不用改老代码。
C语言如何模拟面向对象?
实现面向对象需要解决一下三个问题:
- 数据的封装
- 继承
- 多态
封装
封装描述的是数据的组织形式,就是把属于一个对象的所有属性(数据)组织在一起,C语言中的结构体类型天生就支持这一点。
继承
继承描述的是对象之间的关系,子类通过继承父类,自动拥有父类中的属性和行为(也就是方法)。这个问题只要理解了C语言的内存模型,也不是问题,只要在子类结构体中的第一个成员变量的位置放置一个父类结构体变量,那么子类对象就继承了父类中的属性。
多态
按字面理解,多态就是“多种状态”,描述的是一种动态的行为。在C++中,只有通过基类引用或者指针,去调用虚函数1的时候才发生多态,也就是说多态是发生在运行期间的,C++内部通过一个虚表2来实现多态。那么在C语言中,我们也可以按照这个思路来实现。
/==||未完待续==/
Footnotes#
部分信息可能已经过时