ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

クラスとインスタンス

導入

クラスは一般名詞、インスタンスは固有名詞です。インスタンスはそれぞれ固有の状態を持つオブジェクトのことです。インスタンスの状態の形式とメソッドはクラス内で共通です。

用語
このトピックでは次の用語を覚えます:
  • クラス (class)
  • インスタンス (instance)
解説

一般名詞と固有名詞の関係は、変数の型と変数の実体との関係に似ています。一番単純な例を示すことにしましょう。次のソースコードを見てください。

SAMPLE CODE
void main()
{
    int X = 10;
    int Y = -55;
    int Z = 123;

    return;
}

ここで、一般名詞にあたるのが int です。特定の変数のグループの「整数を格納する」という共通の特徴をあらわしています。そして、固有名詞にあたるのが X,Y,Z です。これらは int のバリエーションであり、固有の値を格納しています。

まとめると、int などの型は変数の雛形であり、X,Y,Z などの変数はその雛形を元に作られた、固有の値を持つ実体です。

オブジェクト指向では、オブジェクトの型のことをクラス、オブジェクトの実体のことをインスタンスと呼びます。そして一般名詞と固有名詞の関係が、クラスとインスタンスにも成り立ちます。次のソースコードを見てください。

SAMPLE CODE
class Human {
public:
    Human( const char *pcName, int nAge );
private:
    char *m_pcName;
    int m_nAge;

    // 以下省略
};

void main()
{
    Human Taro( "太郎", 26 );
    Human Hanako( "花子", 28 );

    return;
}

class Human ... と宣言されているのがクラス Human です。これが雛形となり、インスタンス Taro, Hanako が生成されています。それぞれのインスタンスは "太郎", 26 "花子", 28 という固有の値を格納しています。

オブジェクトの状態とメソッドはクラスに属するでしょうか、それともインスタンスに属するでしょうか?

例えば Human クラスのインスタンス Taro には Eat, Walk, Talk などのような機能(=メソッド)があるでしょう。そしてこれらはインスタンス Hanako にも共通です。つまり、メソッドはクラスで共通の機能のことであり、クラスに属します。

オブジェクトの状態(属性とも言います)はどうでしょうか。これは個々のオブジェクトの現在状態を記憶するためのものですから、インスタンス毎に異なるはずです。例えば Taro の名前属性は "太郎" ですし、年齢属性は 26 です。これらは Hanako のものとは異なります。つまり、状態はインスタンスに属します。

では、状態の種類はどうでしょうか? Taro, Hanako ともに同じ形式の状態を保持しています。つまり、状態そのものはインスタンス固有ですが、状態の形式はクラスで共通です。

まとめると、

  • クラス:
    同じ種類のオブジェクトが共通で持っている機能(=メソッド)と、個々に持つことができる状態の記憶形式を記述したテンプレート
  • インスタンス:
    クラスで宣言された形式のオブジェクトの実体

ということです。

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)