簡體   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