web-dev-qa-db-ja.com

Cプログラミング言語はオブジェクト指向ですか?

私は同僚とCとC++について話していましたが、彼はCはオブジェクト指向であると主張しましたが、そうではないと主張しました。 Cでオブジェクト指向のようなことができることは知っていますが、C++は真のオブジェクト指向言語です。

あなたの考えは何ですか?

また、オブジェクト指向とは何を意味するのかを誰が決めるのか、オブジェクト指向が本当に公式に意味するものを言うのは難しいという議論を引き起こしました。これについてどう思いますか?

42
Brian T Hannan

「Cオブジェクト指向ですか?」 「Cは、オブジェクト指向プログラミングをサポートするために特別に設計されていますか?」そうでない場合、Cは明らかにオブジェクト指向ではありません。

61
James McNellis

多かれ少なかれ任意の言語でオブジェクト指向スタイルでプログラミングできます。 (ランタイムポリモーフィズム(つまり仮想メソッド)には、関数ポインターをサポートする言語が必要だと思います。)

次に例を示します。

19
Tim Robinson

Cはオブジェクト指向ではありません。それが++の背後にある全体の目的でした

オブジェクト指向になるために必要なものの定義に関しては、 wikipedia を確認してください。

個人的に、継承、カプセル化、および多態性をサポートしている場合は、行ってください。ここでのもう1つの重要な点は、クラスやオブジェクトのような素敵なキーワードが役立つことです...

実際のオブジェクト指向言語の例(決定的ではありません)は、Smalltalk、Java、c#、Python、Ruby、C++です。

また、OO PHP、Perlなどの機能、VB(.Netではない)、...

10
NotMe

本物のプログラマは、あらゆる言語でオブジェクト指向のコードを書くことができます。

しかし、いいえ、Cは「オブジェクト指向」言語ではありません。クラス、オブジェクト、ポリモーフィズム、継承という概念はありません。

9
Roddy

混乱は、Cを使用して、ポリモーフィズムやカプセル化などのオブジェクト指向の概念を実装できるため、友人にCがオブジェクト指向であると信じさせる可能性があることです。問題は、オブジェクト指向プログラミング言語と見なされるには、これらの機能を言語に組み込む必要があることです。彼らはそうではありません。

3
Graphics Noob

Cは、「O-O」および「言語」の定義の下ではO-O言語ではありません。

クライアントにO-O APIを提供するコンポーネントの実装言語としてCを使用するのは非常に簡単です。 X Windowsシステムは、そのAPIから見ると本質的に単一継承O-Oシステムですが、実装を見るとC全体が混乱しています。

3
Bill Torcaso

回答yesまたはnoのいずれか、以下に応じて:

  • "Cはオブジェクト指向言語ですか?"と尋ねると、オブジェクト指向のコンストラクタ、キーワード、セマンティックなどがないため、答えは "no"です。 ...

  • 意図する場合 "OOP in C?"を実現できますか?OOPは、言語の要件であるだけでなく、「思考」の方法、プログラミングへのアプローチであり、何らかの言語に触れる前のことです。ただし、OOP = C(またはOOPとしてネイティブに設計されていない他の言語)は、確実に「強制」され、管理が非常に難しくなります。他のOOP言語なので、制限もあります。

3
bzimage
  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
ttchong

友だちがObjective C(OO Cのスーパーセット)について話していない限り、CはOO言語ではありません。実装できるOO Cを使用する概念(古いcfront C++コンパイラが行ったことで、C++をCに変換しました)が、CをOO言語としないため、特に、ポリモーフィズムやカプセル化などの標準的なOOテクニックのサポートを提供します。

はい、CでソフトウェアをOOスタイル、特にマクロのリベラル(ab-)使用で書くことができますが、これらの試みの結果を見た人として、私は強くお勧めしますより適切な言語を使用してください。

1
Timo Geusch

本物のプログラマは、あらゆる言語でオブジェクト指向のコードを書くことができます。

I have Object Oriented Cobolを見た。 Cobolを呼び出すCobol。これらのプログラマを「リアル」と呼びたいですか?

1
newbie007

Cはオブジェクト指向言語ではありません。 Cは、構造化プログラミングをサポートする汎用の命令型言語です。 Cはオブジェクト指向ではないため、C++はOOP機能を持つために存在し、OOPはオブジェクトを中心に編成されたプログラミング言語モデルです。OOP機能を持つための言語は特定のOOPの原則:それらのうち、継承、ポリモーフィズム、抽象化、カプセル化はほとんどありません。

1

CはObject Orientedではありません。

Cは向きなしオブジェクトにします。

C++ does

0
Trevor

いいえ、そうではありません。あなたの友人は間違っています。

0
Ed S.