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

时间:2010-07-13 22:06:25

标签: c oop standards

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

你有什么想法?

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

16 个答案:

答案 0 :(得分:60)

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

答案 1 :(得分:18)

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

以下是几个例子:

答案 2 :(得分:10)

C不是面向对象的。这就是++

背后的全部目的

关于面向对象需要什么的定义:检查wikipedia

就个人而言,如果它支持继承,封装和多态,那么你的好处就是去。这里的另一个关键是拥有像class和object这样的好关键词有助于...

面向对象的真实语言(非结论性)的例子有:Smalltalk,Java,c#,Python,Ruby,C ++ ..

此外,还可以扩展以提供PHP,Perl,VB(非.Net)等OO功能......

答案 3 :(得分:9)

  

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

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

  1. C不是严格意义上的面向对象,因为它没有内置语法支持的面向对象的功能,如类,继承等。
  2. 但是如果你知道这个技巧,你可以简单地使用struct,function pointer,& amp;自指针。 DirectFB是以面向对象的方式编写的C库。不好的事情是它更容易出错,因为它不受语法和编译类型检查的支配。它取决于编码惯例。

    e.g。

      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 ++缺少一些面向对象的功能,但不记得每一个。

答案 6 :(得分:3)

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

使用C作为为其客户端提供O-O API的组件的实现语言非常容易。从其API查看时,X Windows系统本质上是一个单继承O-O系统,但在查看其实现时却是一堆乱七八糟的。

答案 7 :(得分:2)

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

  • 如果你问" C是面向对象的语言?" ,答案是" no"因为它没有面向对象的构造函数,关键字,语义等......

  • 如果你打算"我能在C中实现OOP吗?" ,答案是肯定的,因为OOP不仅是一种语言的要求,而且一种思考"的方式,一种编程方法,在触摸某种语言之前。然而,在C中(或任何其他非本地设计为OOP的语言)的OOP的实现肯定会被强制使用#34;并且很难管理任何其他OOP语言,因此也应该有一些限制。

答案 8 :(得分:1)

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

是的,你可以在C中编写软件OO风格,特别是在使用宏的自由(ab-)时,但是作为已经看过某些尝试结果的人,我强烈建议使用更合适的语言。

答案 9 :(得分:1)

  

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

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

C不是面向对象

C不会未定向定向到对象

C ++ 确实

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

C不是面向对象的。 C ++不是面向对象的。让我解释: 面向对象是Simula的老式事件驱动子集的扩展。真正的面向对象是功能性的和反射性的,因为面向对象实际上是一组范例(事件驱动,功能性,反射性)。只有四种语言真正面向对象,分别是Lisp,Smalltalk,Ruby和Ocaml。 Perl之所以落后,是因为它不起作用。 Scala不具有反射性,因此也比较落后。 C ++仅使用某些类似于Simula的功能进行事件驱动,但是其完全结构化的编程语言,并且不是声明性的,甚至与现实世界不符。面向对象将功能(数学),事件驱动(对话)和反射性(演化)与现实世界相匹配。 C ++只有对话。 C ++不像数学那样声明式,也不像生活那样演变。 C ++只能像人一样交谈。 C ++就像一个白痴,不知道数学是如何工作的或者生活是如何进化的。

答案 15 :(得分:-1)

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