C编程语言是面向对象的吗?

53

我和一位同事谈到了C和C++,他声称C是面向对象的语言,但我认为不是。我知道在C中可以做类似于面向对象的事情,但C++才是真正的面向对象语言。

您对此有什么想法?

此外,这引发了关于谁决定什么是面向对象以及很难说面向对象真正的官方含义的讨论。您对此有何看法?


48
让所有人就面向对象的定义达成共识,然后我才能回答这个问题。 - Yacoby
4
面向对象编程(OOP)是一种编程范式,它使用“对象”——由数据字段和方法以及它们之间的交互组成的数据结构——来设计应用程序和计算机程序。编程技术可能包括数据抽象、封装、模块化、多态性和继承等特性。直到上世纪90年代初期,它才被广泛用于主流软件应用程序开发。现在许多现代编程语言都支持OOP。 - Hamish Grubijan
8
那只是其中一种定义。顺便说一下,"[需要引用]" 真让人感到爱。 - Georg Fritzsche
5
@Yacoby,@Brian:大多数人都同意一些概念,如继承、封装和多态(我有没有遗漏?)。讨论C语言非常简单,因为C基本上没有这些特性。 - Carl Smotricz
9
C语言没有内置的字符串类型,只有char数组。你认为C语言缺乏字符串吗? - Tim Robinson
显示剩余13条评论
16个回答

76
如果你的问题是“C语言是否具有特定支持面向对象编程的功能?”,那么回答是不,C语言显然不是面向对象的。

31
唯一能够称某种语言为“插入范式”的方式,就是通过语言构造来证明它是否支持或强制实施这个范式。 - pmr
C语言是面向对象的吗? - Luca Sans S
在大胆宣称“C显然不是面向对象的”之前,请先仔细研究SunView、XView、Motif、Xaw和Xt。我并不是在声称C是面向对象的,只是人们已经费尽心思地让C变得面向对象。 - John Carlson
COOP 可以以最小的开销为C语言添加面向对象的语法。 - Shmuel Fine

20

7
我记得曾经有一位同事读过关于OO Perl的书。我翻了翻这本书,我的灵魂颤抖了。 - johnc
2
关于我的函数指针评论:我向任何人挑战,用BASIC(原始版本,而不是这个Visual东西)编写面向对象程序。 - Tim Robinson

12

C不具备面向对象的特性,这也是++诞生的主要原因。

至于什么是面向对象的定义:请查看维基百科

就我个人而言,如果支持继承、封装和多态性,那就可以了。另外,关键在于具有类(class)和对象(object)等好的关键字会有助于实现面向对象编程。

实际上,真正的面向对象语言(并非全部)包括:Smalltalk、Java、C#、Python、Ruby、C++等。

此外,也可以通过扩展来提供面向对象功能,如PHP、Perl、VB(非.NET)等。


1
请解释一下...我不想要简单的否定回答。 - Brian T Hannan
2
如果那些是“真正的”面向对象编程语言,那么是否存在假的面向对象编程语言? - Roger Pate
4
“假”的编程语言是指那些像VB.NET和PHP一样有面向对象外表的语言。它们并非从面向对象的角度构建,但确实提供了一些面向对象开发的功能。 - NotMe
你能澄清一下你所说的 VB.NET 中关于面向对象外观的含义吗? - Jordan
@roger 假的面向对象语言 = Mod Perl - Michael Mullany
显示剩余2条评论

10

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

但是,C并非一种“面向对象”的语言。它没有类、对象、多态性、继承等概念。


2
我同意 - 在任何语言中都可以编写面向对象的代码。最近,我将一个传统的C程序重构为将模块分成命名空间,并将所有相关的代码和变量放在一起。令人惊讶的是,它提高了程序的可维护性 - 必须亲眼看到才能相信(尽管需要C++编译器支持命名空间,但我认为命名空间应该成为C的一部分)。 - Contango
@Contango:你确定它们不存在吗?虽然我不经常使用 C 语言,但每当我使用时,我总是惊讶于过去 30 年中添加了多少特性,而人们却将它们视为不存在。例如,可调整大小的数组(C09?)和 const 变量(C89)。 - ArtOfWarfare

7
答案可以是肯定或否定,这取决于以下几点:
  • 如果您问“C语言是否面向对象?”,答案是“否”,因为C没有面向对象的构造函数、关键字、语义等。

  • 如果您想知道“我能在C语言中实现面向对象编程吗?”答案是肯定的,因为面向对象编程不仅是语言要求,还是一种“思考”方式,一种编程方法。然而,在C语言(或任何其他非本来设计用于面向对象编程的语言)中实现面向对象编程肯定会受到限制,将会比其他面向对象编程语言更难以管理和实现。


4

在任何“面向对象”和“语言”的定义下,C都不是一种面向对象的语言。

使用C作为实现语言来为其客户端提供面向对象的API组件非常容易。从API的角度来看,X Windows系统本质上是一个单继承的面向对象系统,但从其实现的角度来看,却是一整个混乱的C代码。


2
这个观点已经被现有的答案充分表达了。 - luser droog

3
  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++缺少一些面向对象的能力,但不记得每个具体是什么。


3

C不是面向对象的语言。 C是一种通用的、命令式的语言,支持结构化编程。 因为C不是面向对象的,所以C++应运而生,以便具备面向对象编程特性。面向对象编程是围绕对象组织的一种编程语言模型。 要具备面向对象编程特性,语言需要实现面向对象编程的一些原则。其中一些原则是继承、多态、抽象、封装。


3
混淆的原因可能是C语言可以用于实现面向对象的概念,如多态性、封装等,这可能使你的朋友相信C语言是面向对象的。问题在于,要被认为是面向对象编程语言,这些特性需要内置于语言中。而它们并没有。

3
除非你的朋友在谈论Objective C(C的面向对象超集),否则C不是一种面向对象的语言。你可以使用C来实现面向对象的概念(这就是旧版cfront C++编译器所做的事情,它将C++翻译成C),但这并不意味着C是一种面向对象的语言,因为它没有专门提供标准面向对象技术的支持,如多态性或封装性。
是的,你可以使用C以面向对象的方式编写软件,特别是通过大量(滥用)宏的使用,但作为一个曾经见过一些尝试结果的人,我强烈建议使用更适合的语言。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接