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のメソッドに指定すると、特定のインスタンスではなくクラスに所属する関数/メソッドとなる。
 これらの関数/メソッドは、クラスのインスタンスを生成しなくても呼び出すことができる。

再検索