问题描述
据我所知,C 不是面向对象的编程语言。如何让用户定义数据类型,并允许对这些数据类型进行一些操作。就像定义原始数据类型并允许对它们进行一些操作一样。
解决方法
没有面向对象的语言。只有具有不同程度的 OO 特性支持的语言。 OO 是一种程序设计方法,因此它主要与语言无关。
OO 大致可以概括为 3 件事:
-
自主模块执行自己指定的任务,对周围程序的了解有限。 (“松耦合”)
-
数据和函数的私有封装,让类的用户不必担心哪些是内部的,哪些是 API 的一部分。防止意外或故意滥用内部构件。减少“命名空间混乱”。
-
继承和多态,可用于代码重用和 API 设计。
第一种是纯粹的程序设计,也是人们最常出错的一种。 2nd 和 3rd 是由 C 支持的,但隐含地并且不是很优雅。
对于私有封装,您可以使用 static
文件范围变量。它在某些情况下工作正常,例如单核嵌入式系统。但它在其他情况下会出现问题 - 它使您的类成为“单例”单实例并使其成为线程不安全的。
您可以使用不透明类型的概念进行更适当的私有封装,您可以在其中转发声明一个结构,然后仅在调用者不可见的文件中定义该结构。这为您提供了真正的多实例私有封装,并且在与函数指针结合时还可用于多态性。不利的一面是它有点麻烦,而且没有多少人意识到它。学校没有教它。
因此,完全有可能用 C 编写面向对象的程序,就像用 C++ 或 Java 编写损坏的、非面向对象的设计完全可能一样。如果您有语言支持,那么做 OO 就会容易得多。
例如“RAII”的 C++ 概念,严格来说它本身并不是面向对象的特性,但它在进行面向对象设计时有很大帮助,因为它为您提供了隐式构造函数/析构函数调用,而您没有必须依赖调用者明确地执行它们,就像在 C 中的情况一样。另一个例子是强大而方便的 this
指针,在 C 中,您必须手动将它传递给每个函数调用。