【C++】クラス関連の用語について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
旧:ふくとも
記事: 12
登録日時: 9年前

【C++】クラス関連の用語について

#1

投稿記事 by 旧:ふくとも » 9年前

まず初めに、今回の質問はプログラムのコードに直接は関係ない(と思います)です。

先日C++のクラス、構造体について調べていたところ「インスタンス」と「オブジェクト」という用語が似たような使われ方をしているのを見かけ、その違いについても調べてみたところいまいちよく分かりませんでした。
そこでここで質問してみることにしました。

インスタンスとオブジェクトの違いが何か、例を挙げつつ教えて頂けると幸いです。

hide

Re: 【C++】クラス関連の用語について

#2

投稿記事 by hide » 9年前

あまり気にする必要は無いと思います。
あまり難しいことをしないのであればインスタンスもオブジェクトも変わりないでしょう。

しかし、関数オブジェクトを関数インスタンスとは言わないでしょうから
そういう部分に手をつけるなら、区別は必要なのかもしれないです。
手をつけたことはありませんが。

クラスからnewしたものをインスタンスと考えておけば問題無いと思います。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 【C++】クラス関連の用語について

#3

投稿記事 by h2so5 » 9年前

hideさんの仰る通り、基本的にはオブジェクトとインスタンスは区別されないで使われることが多いです。


↓ 以下、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したものをインスタンスと考えておけば問題無いと思います。
それだけではなくて、自動変数でもグローバル変数でもインスタンスと呼ぶと思います。

旧:ふくとも
記事: 12
登録日時: 9年前

Re: 【C++】クラス関連の用語について

#4

投稿記事 by 旧:ふくとも » 9年前

関数以外の記憶域全般を指す場合がオブジェクト
変数や関数、クラスなどといった形を持つものを指す場合がインスタンス

ということは、コンパイル中に限っては
プロトタイプ宣言だけがされていて定義が読み込まれていない状態の関数はどちらにも属さないということになるのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 【C++】クラス関連の用語について

#5

投稿記事 by h2so5 » 9年前

コンパイル中かどうかとかプロトタイプ宣言だけかどうかというのは一切関係がありません。

関数自体はオブジェクトでもインスタンスでもありません。
ただし、テンプレート関数の場合は具体化された関数のことをインスタンスと呼称することがあるというだけです。

sleep

Re: 【C++】クラス関連の用語について

#6

投稿記事 by sleep » 9年前

インスタンスという言葉の定義を求めていらっしゃる様ですが
オブジェクト指向というパラダイムから少し頭を離した方が良いですね。

インスタンスは状態を示すために使用されるはずの言葉で
別にオブジェクト指向固有の用語ではないです。

世間ではオブジェクト指向の用語として使用しているみたいですが
Alan Curtis Kayはインスタンスという言葉にパラダイムとして固有の意味を持たせていないです。
そもそもオブジェクト指向自体がそれまでにあったパラダイムのただの寄せ集めであり、表現の定義こそ刷新されているものの固有なものはメッセージくらいです。
恐らく、smalltalkにおけるインスタンスオブジェクトとクラスオブジェクトという用語の
インスタンスオブジェクトが原因かと思われますが、あくまで対比して示すために定義されている表現であり
インスタンスという言葉自体にオブジェクト指向固有の意味があるわけではありません。
現にクラスオブジェクトも登録時にインスタンス化されており、クラスオブジェクトに属するインスタンスオブジェクトです。

オブジェクトを生成することを「オブジェクトをインスタンス化する」などと言い、
C++の仕様書においても、ほとんどが実体化(Instantiation)などと状態を示す言葉としてしか使用されておらず、
それ以上の意味はありません。

ISLe()

Re: 【C++】クラス関連の用語について

#7

投稿記事 by ISLe() » 9年前

わたしの個人的な解釈ですが
ひとつの定義から複数の実体を生成できる場合、それら個々の実体を「([定義]の)インスタンス」と呼ぶ
と思ってます。

旧:ふくとも
記事: 12
登録日時: 9年前

Re: 【C++】クラス関連の用語について

#8

投稿記事 by 旧:ふくとも » 9年前

特に気にしなくても問題無い、ということは理解しましたので解決とさせていただきます。

私個人としてはISLe()様の解釈が関数はインスタンスに含まれないことを上手く説明できていて分かりやすいかなぁ、と思いました。
未だ理解が不十分なので他の方々の意見はもう少し知識を付けてから再度読み返してみようと思います。

返信ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る