4

「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」(特にプロトタイプデザインパターンに関する章)を読んでいたところ、次のように述べられていました...

「プロトタイプは、クラスがオブジェクトではなく、実行時に利用できる型情報がほとんどまたはまったくない C++ などの静的言語で特に役立ちます。」(121ページ)

(私のものを強調)

私は常にクラスはオブジェクトと同義であると考えていましたが、このステートメントが何を意味するのかについて混乱しています。クラスはどのようにオブジェクトではなく、言語が静的であることがなぜ重要なのですか?

4

9 に答える 9

5

C++ のクラスはオブジェクトではありません。クラスは、オブジェクトの作成方法の記述であり、オブジェクトの型への参照です。

Python のような言語と比較してください。Python では、C++ のように、クラスからオブジェクトをインスタンス化します。C++ とは異なり、使用したクラスもオブジェクトです。通常は typetypeを持ち、実行時に新しいクラスを作成したり、他のオブジェクトと同様に操作したり、異なる型を持つクラスであるオブジェクトを作成したりできます。

なぜこれが必要なのか疑問に思うかもしれませんが、通常は必要ありません.C++テンプレートのメタプログラミングのようなもので、必要なときにのみ必要です.他の方法では目標を達成できないため. おそらく、Python でメタクラスを使用して解決する問題を、テンプレート メタプログラミングを使用して C++ で解決する場合もあります。

于 2012-06-29T16:35:05.153 に答える
3

C++ では、これはクラスを宣言します。

class A {
public:
  int a;
};

一方、これはオブジェクトを宣言します:

A a;

オブジェクトを照会できるように、実行時にクラスを照会することはできません。operator+「オブジェクト 'a'、あなたのアドレスは何ですか? . などを呼び出してください」と言うのは理にかなっています。C++ では、静的な型付けを使用しているため、「クラス A、メンバーのリストは何ですか? 新しいメンバー "b" を追加してください」と言っても意味がありません。

他の言語 (Python が思い浮かびます) では、各クラスもオブジェクトであるため、この方法でクラスを操作できます。オブジェクトのテンプレートとして機能するだけでなく、クラス自体もオブジェクトです。出力したり、変更したりできます。

于 2012-06-29T16:35:54.853 に答える
3

たとえば、クラスは本が何であるかを説明できます: 名前、著者、発行日、説明。

「Book」クラスのオブジェクトは、特定の本です: C++ Primer Plus、Stephen Prata、2005 年、C++ を教える本。

したがって、クラスはオブジェクトと同じではありません。

于 2012-06-29T18:07:37.323 に答える
2

Andrew Aylett が言ったことを拡張します。

C++ のクラスはオブジェクトではありません。クラスは、オブジェクトの作成方法の記述であり、オブジェクトの型への参照です。

さらに、Python や smalltalk などの言語で。すべてがオブジェクトです。関数はオブジェクトであり、クラスはオブジェクトです。そのため、これらの言語は動的に型指定されています。つまり、型は実行時にチェックされ、変数は任意の型を取ることができます。

C++ は静的に型付けされます。変数は 1 つの型のみを取ることができ、型チェックはコンパイル時に実行されます。

したがって、たとえば Python では、その場でクラスを変更できます。これはオブジェクトであり、変更できるため、関数とフィールドを追加します。

于 2012-06-29T16:41:05.490 に答える
1

あなたがそれを理解できるように、私はそれをより簡単に言えます:

オブジェクトは、クラスの「物理的な」インスタンスです。プログラムの実行中にメモリを消費します。

クラスはオブジェクトを記述します: 階層、プロパティ、メソッド。オブジェクトを作成するための「テンプレート」のようなクラスです。

于 2012-06-29T17:37:50.463 に答える
1

その文が指しているのは、C++ のような言語ではクラスが一次エンティティではないという事実です。他の言語では、クラスをパラメーターとして関数に渡すことができます。たとえば、オブジェクトや関数をパラメーターとして渡すのと同じ方法です。

クラスの一次エンティティであるかどうかには、さらに多くの意味があります。たとえば、実行時にクラスを変更する可能性や、クラスの内部全体を検査する可能性などです。

通常、クラスは、Ruby のような動的言語や Lisp のメタ オブジェクト プロトコルなどでは、一次エンティティとして認識されます。

これで少し明確になることを願っています。

于 2012-06-29T16:36:17.533 に答える
1

クラスがオブジェクトと呼ばれる場合、実行時にそのクラスを表すオブジェクトがあることを意味します。C++ では、クラスはコンパイル時に分解されます。それらのインスタンス (つまりオブジェクト) は、オブジェクトのフィールドを保持する単なるバイトのシーケンスであり、クラス自体への参照はありません。現在、C++ は RTTI を介して実行時にいくつかの型情報を提供しますが、これは多相型のみであり、クラス オブジェクトとは見なされません。

実行時にクラスを表すオブジェクトがないことが、C++ にリフレクションがない理由です。特定のクラスを表すオブジェクトがないため、特定のクラスに関する情報を取得する方法がありません。

ところで、C++ は 2 レベル言語と見なされます。オブジェクトはクラスのインスタンスですが、コンパイル タイプでのみ存在するため、クラスは何のインスタンスでもありません。C# や Java などの 3 レベル言語では、クラスは実行時のオブジェクトでもあり、それ自体がさらに別のクラス (Java では Class、C# では Type) のインスタンスです。最後のクラスはそれ自体のインスタンスであるため、言語には 3 つのレベルしかありません。より多くのレベルを持つ言語がありますが、それはこの質問の範囲を超えています...

于 2012-06-29T16:39:54.587 に答える
1

クラスはオブジェクトと同じではありません。クラスは (多かれ少なかれ) タイプであり、オブジェクトはインスタンスであり、次のようになります。

int i;
YourClass object;

ここでは、iintは同じではありません。どちらもYourClassとではありませんobject

ステートメントが言いたいこと: 多くのオブジェクト指向言語は非常にオブジェクト指向であるため、すべて (またはほぼすべて) を (1 つまたは別のクラスの) オブジェクトにします。そのため、多くの言語では、 aclassはいくつかのインスタンス (したがってオブジェクト) になります (class class混乱する可能性があります)。

他のオブジェクトを扱うことができるように、そのような言語でクラス (つまり型) を扱うことができるため、これには利点があります。それらを変数に格納したり、実行時にクラスを操作したりするなど、非常に動的なことを行うことができます(たとえば、プログラムで必要な新しいクラスを作成するなど)。

次の C++ に似た疑似コードを見てください。

YourClass myObject = new YourClass();                // creates an object (an instance)
Class baseClass = myObject.get_class();              // store the class of myObject in baseClass. That's storing a type in a variable (more or less)
Class subClass = myObject.inherit();                 // dynamically create a new class, that only exists in variable subClass (a Class-object), inheriting from baseClass
subClass.add_method(some_function);                  // extend the new class by adding a new method
subClass.get_class() subClass.create_instance();     // declare a new variable (object) of your newly created type 
BaseClass another_onne = subClass.create_instance(); // also valid, since you inherited

これは明らかに c++ にうまく変換されません。これは、c++ の厳密な型指定のためです。他の言語はタイピングがより動的であり、この柔軟性が役立つ場合があります (make の思考はより複雑になり、両方が同時に行われることもあります)。それでも、C ++を理解していれば、原則を説明していると思います。

于 2012-06-29T16:50:04.227 に答える
1

クラスはオブジェクトと同義だとずっと思っていた

OOP 文献の言語は、特定のものではない場合があります。プログラミング言語がオブジェクトとは何かについて多少異なる概念を持っていることも助けにはなりません。

クラスは、オブジェクト (そのクラスのインスタンス) が作成されるテンプレートまたは定義です。つまり、クラスは、そのクラスのオブジェクト (またはタイプ... 詳細は後述) の構造、型シグネチャ、および動作を提供します。

オブジェクトは、そのクラスのインスタンスのメモリ内の単なる場所です。

ウィキペディアはこれに関する優れたドキュメントを提供しています。私はあなたがそれを読むことをお勧めします:

http://en.wikipedia.org/wiki/Class_(computer_programming )

http://en.wikipedia.org/wiki/Object_(オブジェクト指向プログラミング)

また、typeという概念があります。型 (または、一部の文献やプログラミング言語で呼ばれることがあるインターフェイス) は、通常、型/メソッド シグネチャ (および場合によっては動作) のコレクションです。Java インターフェイスや C++ の純粋仮想クラスなどは、を表す傾向があります(ただし、まったく同じというわけではありません)。

次に、そのに準拠するクラス(インターフェースまたは純粋仮想クラス) は、その型の実装です。

そのクラス、その型の実装は、そのクラス/型のオブジェクトをメモリ内に構築する方法の単なるレシピです。

クラス/タイプをインスタンス化するときは、具体化して、そのクラスのインスタンス (オブジェクト) をメモリ内に構築します。

C++ では、クラス自体はインスタンス化されないため、クラスはオブジェクトではありません。C++ クラスは、他のクラスのインスタンスではありません (上記の定義を参照してください)。

OTH、Java などの言語では、クラス自体は基本クラス (java.lang.Class) のインスタンスによって表されます。したがって、クラス X には、それに関連付けられたメモリ内のオブジェクト (java.lang.Class インスタンス) があります。そして、その「クラス」オブジェクトを使用して、(理論的には) クラス/タイプ X の別のインスタンス (またはオブジェクト) をインスタンス化または製造できます。

混乱する可能性があります。クラス、型、プロトタイプ、オブジェクト/インスタンスに関する文献を検索して読むことを強くお勧めします。

そして、私はこの声明が何を意味するのかについて混乱しています。クラスはどのようにオブジェクトではなく、

上記で説明したとおりです。クラスはオブジェクトではありません。オブジェクトはインスタンスであり、クラスまたは型の「レシピ」によって構築および初期化されるメモリの一部です。

また、言語が静的であることが重要なのはなぜですか?

たとえば、Java は静的に型付けされますが、クラス自体がオブジェクトになる可能性があるため、本のその部分は少し誤解を招く可能性があります。おそらく、テキストは動的に型付けされた言語 (JavaScript など) について言及している可能性があります。この言語では、クラスもオブジェクトまたはインスタンスになる可能性があります。

私の提案は、オブジェクトという言葉を決して使用せず、語彙を単に「クラス」と「インスタンス」に限定することです。しかし、それは私の個人的な好みです。他の人は同意しないかもしれません。

于 2012-06-29T17:10:44.167 に答える