繁体   English   中英

C语言是面向对象的吗?

[英]Is the C programming language object-oriented?

我和一位同事谈论 C 和 C++,他声称 C 是面向对象的,但我声称它不是。 我知道你可以用 C 做类似面向对象的事情,但 C++ 是一种真正的面向对象语言。

你怎么看?

此外,它引发了关于谁决定面向对象意味着什么的讨论,并且很难正式说出面向对象的真正含义。 你对此有何想法?

如果通过“C 是面向对象的吗?” 您的意思是“C 设计的设施是否专门用于支持面向对象的编程?” 那么,不,C 显然不是面向对象的。

您可以使用或多或少的任何语言以面向对象的风格进行编程。 (我认为运行时多态性——即虚拟方法——需要一种支持函数指针的语言。)

下面是几个例子:

C 不是面向对象的。 这就是 ++ 背后的全部目的

至于什么是面向对象的定义:检查wikipedia

就个人而言,如果它支持继承、封装和多态,那么你就可以了。 这里的另一个关键是使用类和对象之类的好关键字往往会有所帮助......

真正的面向对象语言(非决定性)的例子是:Smalltalk、Java、c#、Python、Ruby、C++..

此外,还可以通过扩展来提供 OO 功能,例如 PHP、Perl、VB(不是 .Net)……

真正的程序员可以用任何语言编写面向对象的代码。

但是不,C 不是“面向对象”语言。 它没有类、对象、多态、继承的概念。

答案可以是 yes 或 no ,具体取决于:

  • 如果你问“C 是一种面向对象的语言吗?” ,答案是否定的,因为它没有面向对象的构造函数、关键字、语义等......

  • 如果您打算“我可以在 C 中实现 OOP 吗?” ,答案是肯定的,因为OOP不仅是一种语言的要求,也是一种“思考”的方式,一种编程的方法,在接触某种语言之前。 然而,在 C(或任何其他并非本机设计为 OOP 的语言)中实现 OOP 肯定会“强制”并且比任何其他 OOP 语言更难以管理,因此也应该有一些限制。

在“OO”和“语言”的任何定义下,C 不是 OO 语言。

使用 C 作为组件的实现语言非常容易,该组件为其客户端提供 OO API。 从其 API 来看,X Windows 系统本质上是一个单继承 OO 系统,但从其实现来看,则是一堆 C 语言。

混淆可能是 C 可用于实现面向对象的概念,如多态性、封装等,这可能会让您的朋友相信 C 是面向对象的。 问题是要被视为面向对象的编程语言,这些功能需要内置到语言中。 他们不是。

  1. C 不是严格意义上的面向对象,因为它没有内置语法支持的面向对象功能,如类、继承等。

但是如果你知道这个技巧,你可以简单地使用结构、函数指针和自指针轻松地向它添加面向对象的功能。 DirectFB 就是这样一个以面向对象的方式编写的 C 库。 不好的是它更容易出错,因为它不受语法和编译类型检查的约束。 它基于编码约定。

例如

  IDirectFB/*a typedef of a struct*/ *dfb = NULL;
  IDirectFBSurface/*another typedef of a struct*/ *primary = NULL;
  DirectFBCreate (&dfb); /*factory method to create a struct (e.g. dfb) with 
                         pointers to function and data. This struct is 
                         like an object/instance of a class in a language with build-in 
                         syntax support for object oriented capability  */
  dfb->SetCooperativeLevel/*function pointer*/ 
          (dfb/*self pointer to the object dfb*/, 
           DFSCL_FULLSCREEN);
  dsc.flags = DSDESC_CAPS;
  dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
  dfb->CreateSurface/*function pointer, also a factory method 
                       to create another object/instance */
          ( dfb/*self pointer to the object dfb*/, 
            &dsc, 
            &primary/*another struct work as object of another class created*/ );
  primary->GetSize/*function pointer*/ 
              (primary/*self pointer to the object primary*/, 
               &screen_width, 
               &screen_height);

2 . C++ 是面向对象的,因为它内置了对类和继承等面向对象功能的支持。 但是有人认为它不是完整的或纯粹的面向对象语言,因为它确实允许使用 C 语法(结构化编程语法)。 我还记得 C++ 缺乏一些面向对象的功能,但不能准确地记住每一个。

除非您的朋友在谈论 Objective C(C 的 OO 超集),否则不,C 不是 OO 语言。 您可以使用 C 实现 OO 概念(这是旧的 cfront C++ 编译器所做的,它将 C++ 翻译成 C),但这并不使 C 成为一种 OO 语言,因为它没有专门提供对标准 OO 技术(如多态性或封装)的支持。

是的,您可以用 C 编写 OO 风格的软件,尤其是在自由(ab-)使用宏的情况下,但作为已经看到其中一些尝试结果的人,我强烈建议使用更适合的语言。

真正的程序员可以用任何语言编写面向对象的代码。

已经看到Cobol语言的面向对象的。 称为 Cobol 的 Cobol。 你想称这些程序员为“真实的”吗?

C 不是面向对象的语言。 C 是一种通用的命令式语言,支持结构化编程。 因为 C 不是面向对象的,因此 C++ 的出现是为了具有 OOP 功能,而 OOP 是一种围绕对象组织的编程语言模型。 一门语言为了拥有 OOPs 特性需要实现 OOPs 的某些原则。其中很少有继承、多态、抽象、封装。

C 不是面向对象的

C 不面向对象

C++确实如此

尽管 C 本身是作为过程语言构建的(它根据过程“思考”:您首先执行函数 A,然后将输出传递给函数 B 等。它仅支持“开箱即用”的功能程序流),但有可能通过 C 实现 OOP(在 OOP 中,故事由对象及其职责驱动,而不是由函数及其调用顺序驱动)。 事实上,一些早期的 C++ 实现将代码转换为一些 C 代码,然后构建它。 但是,有时您必须使用 C(对于不支持 C++ 等的嵌入式设备/GPU 语言)。 而你想要 OOP。 我建议您查看COOP - 我的 C OOP 轻量级但功能强大的 C 面向对象编程框架。

C 是一种基于对象的语言,它不支持面向对象语言的许多特性,如继承、多态等。

C 不是面向对象的。 C++ 不是面向对象的。 让我解释一下:面向对象是 Simula 旧时尚事件驱动子集的扩展。 真正的面向对象是功能性和反射性的,因为面向对象实际上是一组范式(事件驱动、功能性、反射性)。 只有四种语言是真正面向对象的,它们是 Lisp、Smalltalk、Ruby 和 Ocaml。 Perl 介于两者之间,因为它不起作用。 Scala 不是反射性的,所以也落后了。 C++ 只是使用一些类似 Simula 的工具来驱动事件,但它是完全结构化的编程语言,它不是声明式的,甚至不匹配现实世界。 面向对象将现实世界与功能(数学)、事件驱动(对话)和反射(进化)相匹配。 C++ 只有对话。 C++ 不像数学那样是声明式的,也不像生命一样进化。 C++ 只像人一样交谈。 C++ 就像一个不知道数学如何运作或生命如何进化的白痴。

不,不是,你的朋友错了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM