まず初めに、今回の質問はプログラムのコードに直接は関係ない(と思います)です。
先日C++のクラス、構造体について調べていたところ「インスタンス」と「オブジェクト」という用語が似たような使われ方をしているのを見かけ、その違いについても調べてみたところいまいちよく分かりませんでした。
そこでここで質問してみることにしました。
インスタンスとオブジェクトの違いが何か、例を挙げつつ教えて頂けると幸いです。
【C++】クラス関連の用語について
Re: 【C++】クラス関連の用語について
あまり気にする必要は無いと思います。
あまり難しいことをしないのであればインスタンスもオブジェクトも変わりないでしょう。
しかし、関数オブジェクトを関数インスタンスとは言わないでしょうから
そういう部分に手をつけるなら、区別は必要なのかもしれないです。
手をつけたことはありませんが。
クラスからnewしたものをインスタンスと考えておけば問題無いと思います。
あまり難しいことをしないのであればインスタンスもオブジェクトも変わりないでしょう。
しかし、関数オブジェクトを関数インスタンスとは言わないでしょうから
そういう部分に手をつけるなら、区別は必要なのかもしれないです。
手をつけたことはありませんが。
クラスからnewしたものをインスタンスと考えておけば問題無いと思います。
Re: 【C++】クラス関連の用語について
hideさんの仰る通り、基本的にはオブジェクトとインスタンスは区別されないで使われることが多いです。
↓ 以下、C++でのもう少し詳しい定義
C++の規格書によれば、「オブジェクト」とは関数を除く記憶域のことを指します。
つまり変数や定数(マクロは除く)などはすべてオブジェクトですし、newしてどこからも参照されていないものもオブジェクトです。
§ 1.7
クラスや構造体のオブジェクトもインスタンスですが、具体化されたテンプレート関数も「インスタンス」と呼んでいます。
(つまりインスタンス化されたテンプレート関数はオブジェクトではありませんがインスタンスと呼ばれます)
§ 3.7.4.2
[追記]
↓ 以下、C++でのもう少し詳しい定義
C++の規格書によれば、「オブジェクト」とは関数を除く記憶域のことを指します。
つまり変数や定数(マクロは除く)などはすべてオブジェクトですし、newしてどこからも参照されていないものもオブジェクトです。
§ 1.7
一方「インスタンス」の定義に関しては規格書にははっきりとは書かれていませんが、何らかの型・テンプレートが「具体化」されたものを指しています。An object is a region of storage. [ Note: A function is not an object, regardless of whether or not it occupies storage in the way that objects do. — end note ]
クラスや構造体のオブジェクトもインスタンスですが、具体化されたテンプレート関数も「インスタンス」と呼んでいます。
(つまりインスタンス化されたテンプレート関数はオブジェクトではありませんがインスタンスと呼ばれます)
§ 3.7.4.2
以上のことからA deallocation function can be an instance of a function template.
この場合の関数オブジェクトというのは関数のように振る舞う記憶域であって、具体化された関数ではないということです。hide さんが書きました:しかし、関数オブジェクトを関数インスタンスとは言わないでしょうから
[追記]
それだけではなくて、自動変数でもグローバル変数でもインスタンスと呼ぶと思います。hide さんが書きました:クラスからnewしたものをインスタンスと考えておけば問題無いと思います。
Re: 【C++】クラス関連の用語について
関数以外の記憶域全般を指す場合がオブジェクト
変数や関数、クラスなどといった形を持つものを指す場合がインスタンス
ということは、コンパイル中に限っては
プロトタイプ宣言だけがされていて定義が読み込まれていない状態の関数はどちらにも属さないということになるのでしょうか?
変数や関数、クラスなどといった形を持つものを指す場合がインスタンス
ということは、コンパイル中に限っては
プロトタイプ宣言だけがされていて定義が読み込まれていない状態の関数はどちらにも属さないということになるのでしょうか?
Re: 【C++】クラス関連の用語について
コンパイル中かどうかとかプロトタイプ宣言だけかどうかというのは一切関係がありません。
関数自体はオブジェクトでもインスタンスでもありません。
ただし、テンプレート関数の場合は具体化された関数のことをインスタンスと呼称することがあるというだけです。
関数自体はオブジェクトでもインスタンスでもありません。
ただし、テンプレート関数の場合は具体化された関数のことをインスタンスと呼称することがあるというだけです。
Re: 【C++】クラス関連の用語について
インスタンスという言葉の定義を求めていらっしゃる様ですが
オブジェクト指向というパラダイムから少し頭を離した方が良いですね。
インスタンスは状態を示すために使用されるはずの言葉で
別にオブジェクト指向固有の用語ではないです。
世間ではオブジェクト指向の用語として使用しているみたいですが
Alan Curtis Kayはインスタンスという言葉にパラダイムとして固有の意味を持たせていないです。
そもそもオブジェクト指向自体がそれまでにあったパラダイムのただの寄せ集めであり、表現の定義こそ刷新されているものの固有なものはメッセージくらいです。
恐らく、smalltalkにおけるインスタンスオブジェクトとクラスオブジェクトという用語の
インスタンスオブジェクトが原因かと思われますが、あくまで対比して示すために定義されている表現であり
インスタンスという言葉自体にオブジェクト指向固有の意味があるわけではありません。
現にクラスオブジェクトも登録時にインスタンス化されており、クラスオブジェクトに属するインスタンスオブジェクトです。
オブジェクトを生成することを「オブジェクトをインスタンス化する」などと言い、
C++の仕様書においても、ほとんどが実体化(Instantiation)などと状態を示す言葉としてしか使用されておらず、
それ以上の意味はありません。
オブジェクト指向というパラダイムから少し頭を離した方が良いですね。
インスタンスは状態を示すために使用されるはずの言葉で
別にオブジェクト指向固有の用語ではないです。
世間ではオブジェクト指向の用語として使用しているみたいですが
Alan Curtis Kayはインスタンスという言葉にパラダイムとして固有の意味を持たせていないです。
そもそもオブジェクト指向自体がそれまでにあったパラダイムのただの寄せ集めであり、表現の定義こそ刷新されているものの固有なものはメッセージくらいです。
恐らく、smalltalkにおけるインスタンスオブジェクトとクラスオブジェクトという用語の
インスタンスオブジェクトが原因かと思われますが、あくまで対比して示すために定義されている表現であり
インスタンスという言葉自体にオブジェクト指向固有の意味があるわけではありません。
現にクラスオブジェクトも登録時にインスタンス化されており、クラスオブジェクトに属するインスタンスオブジェクトです。
オブジェクトを生成することを「オブジェクトをインスタンス化する」などと言い、
C++の仕様書においても、ほとんどが実体化(Instantiation)などと状態を示す言葉としてしか使用されておらず、
それ以上の意味はありません。
Re: 【C++】クラス関連の用語について
わたしの個人的な解釈ですが
ひとつの定義から複数の実体を生成できる場合、それら個々の実体を「([定義]の)インスタンス」と呼ぶ
と思ってます。
ひとつの定義から複数の実体を生成できる場合、それら個々の実体を「([定義]の)インスタンス」と呼ぶ
と思ってます。
Re: 【C++】クラス関連の用語について
特に気にしなくても問題無い、ということは理解しましたので解決とさせていただきます。
私個人としてはISLe()様の解釈が関数はインスタンスに含まれないことを上手く説明できていて分かりやすいかなぁ、と思いました。
未だ理解が不十分なので他の方々の意見はもう少し知識を付けてから再度読み返してみようと思います。
返信ありがとうございました。
私個人としてはISLe()様の解釈が関数はインスタンスに含まれないことを上手く説明できていて分かりやすいかなぁ、と思いました。
未だ理解が不十分なので他の方々の意見はもう少し知識を付けてから再度読み返してみようと思います。
返信ありがとうございました。