クラスベースのオブジェクト指向プログラミングでは、クラス変数とは、クラスのインスタンスがいくつ存在するかに関係なく、そのクラスのコピーが 1 つだけ存在するクラスで定義された変数 です。[1] [2] [3] [4] [5]
クラス変数はインスタンス変数ではありません。クラス属性(またはクラス プロパティ、フィールド、データ メンバー)の特殊なタイプです。インスタンス メンバーとクラスメンバーの同じ二分法はメソッド(「メンバー関数」)にも適用されます。つまり、クラスにはインスタンス メソッドとクラス メソッドの両方が存在する場合があります。
静的メンバー変数と静的メンバー関数
一部の言語では、クラス変数とクラスメソッドは、動的ディスパッチではなく静的に解決されるか、実行時(オブジェクトのインスタンス化のたびに)動的に割り当てられるのではなく、コンパイル時に(クラス全体に対して 1 回、静的変数として)メモリが静的に割り当てられます。ただし、他の場合には、これらのいずれかまたは両方が動的です。たとえば、クラスを(実行時に)動的に定義できる場合、これらのクラスのクラス変数はクラスが定義されるときに動的に割り当てられ、一部の言語ではクラスメソッドも動的にディスパッチされます。
そのため、一部の言語では、静的メンバー変数または静的メンバー関数は、「クラス変数」または「クラス関数」と同義語として、またはそれらに代わって使用されますが、これらは言語間で同義ではありません。これらの用語は、Java、C#、[5]、C++で一般的に使用されており、クラス変数とクラスメソッドはstaticキーワードで宣言され、静的メンバー変数または静的メンバー関数と呼ばれます。
例
C++
構造体リクエスト{
静的intカウント;
int数値;
リクエストオブジェクト(){
number = count ; // インスタンス変数 "this->number" を変更します
++ count ; // クラス変数 "Request::count" を変更します
}
};
intリクエスト:: count = 0 ;
この C++ の例では、クラス変数Request::countはコンストラクタへの呼び出しごとに増加されるため、には常に構築されたリクエストの数が格納され、新しいリクエスト オブジェクトにはそれぞれ順番に が与えられます。はクラス変数であるため、オブジェクトは 1 つだけです。対照的に、各リクエスト オブジェクトには独自のフィールドが含まれます。
Request::countnumbercountRequest::countnumber
また、変数はRequest::count一度だけ初期化されることにも注意してください。
パイソン
class Dog :
vertebrate_group = 'mammals' # クラス変数
dog_1 = Dog
print ( dog_1 . vertebrate_group ) # クラス変数へのアクセス
上記の Python コードでは、Dog クラスに犬の脊椎動物グループを哺乳類として提供するクラス変数しかないため、多くの情報は提供されません。インスタンス変数では、Dog クラスに 1 つ以上のインスタンス変数を持たせることで、独自のオブジェクト (この場合は dog_1) をカスタマイズできます。
注記
- ^ 「Java チュートリアル、変数」 。2010年 10 月 21 日閲覧。
- ^ 「Java チュートリアル、インスタンスとクラス メンバーの理解」 。2010年 10 月 21 日閲覧。
- ^ 「Python 言語リファレンス、複合ステートメント」 。2010年 10 月 21 日閲覧。
- ^ 「Objective-C ランタイムリファレンス」。Apple Developer 。 2018年4月1日閲覧。
- ^ ab 「C# のクラス変数」。Syntaxdb。2018年4 月 1 日閲覧。
