static
読み:スタティック
外語:static
C
/
C++
/
Java
の
予約語
の一つで、さまざまな意味を持つ。
目次
概要
特徴
ファイルローカル
利用法
仕様
ローカル変数
メンバー変数/フィールド
メンバー関数/メソッド
概要
C/C++
では、オブジェクトに静的な記憶クラスを与えるための指定子。
関数の中でも外でも使用することができる。
しかし文脈により意味するところが変わるため不評で、C++ではstaticの機能の一部を他の方法で実装している。
特徴
ファイルローカル
利用法
C/C++で、トップレベルの変数や関数をstatic指定した場合は、そのスコープをファイルローカルとする。
グローバル変数
をstaticで宣言すると、そのファイル内の関数でのみ参照でき外部に非公開の静的グローバル変数となる。
関数
をstaticで宣言すると、そのファイル内の関数からしか呼び出せない、外部に非公開の静的関数となる。extern等を併用して他からの呼び出しを想定しない関数は、静的関数にするのが望ましいとされている。
staticでファイルローカルにした場合、そのファイル内からの参照がない場合には未使用オブジェクトとしてワーニングを発生させることが容易に可能となる。
仕様
元々C/C++では、トップレベルに置かれた変数や関数はstaticを付けなくても最初から記憶クラスが静的なものとなり、変数であればそれは
グローバル変数
となる。
C/C++は変則的な規則として、最初から記憶クラスがstaticなものにstaticを付けると、名前をファイルスコープに制限するよう機能することになっており、このためstaticを付けたグローバル変数はファイルローカルになるのである。
localやprivateなど、別の予約語を作れば分かり易かったのだが、Cではなぜかそうはしなかった。しかし、このように文脈によって意味が変わる仕様は分かりにくく不評であることから、C++ではstaticではなく
namespace
を使った無名名前空間を仕様として用意しており、staticを使わずに同様のことを可能としている。
ローカル変数
C/C++で、ローカル変数をstatic指定すると、静的ローカル変数となる。
対するauto変数の場合は毎回スタックに生成されるが、静的ローカル変数の場合は一度だけ生成され、プログラムの
生存期間
の間存在する。
初期化は最初の一回だけ実行される。定義と同時に代入も可能だが、何度その定義箇所を通過しても、値が変数に代入されるのは最初の一回だけである。
メンバー変数/フィールド
C++の
メンバー変数
、Javaのフィールドに指定すると、特定の
インスタンス
ではなく
クラス
に所属する変数/フィールドとなる。
これらは、クラスのインスタンスを生成しなくても存在する。
また、クラスをいくつインスタンス化しても、staticなメンバー変数/フィールドはクラス内にただ一つしか存在しないため、全てのインスタンスから同じものが参照される。
メンバー関数/メソッド
C++の
メンバー関数
、Javaの
メソッド
に指定すると、特定のインスタンスではなくクラスに所属する関数/メソッドとなる。
これらの関数/メソッドは、クラスのインスタンスを生成しなくても呼び出すことができる。
再検索