staticは、多くのプログラミング言語で宣言を変更するために使用される予約語です。キーワードの効果は、特定のプログラミング言語の詳細によって異なりますが、最も一般的には、(静的変数として)生存期間と(リンケージに応じて)可視性を変更したり、クラス内でインスタンスメンバーの代わりにクラスメンバーを指定したりするために使用されます。
C の前身であるBCPLやBには、常に存在するストレージを意味する静的ストレージの概念が既に存在していました。[ 1 ] [ 2 ]staticしかし、B にはキーワードはありませんでしたが、extrn外部ストレージ (すべての関数の外部であり、関数の外で定義する必要がある) を指定するキーワードがあり、これは常に静的です。これとは対照的に、自動ストレージautoを持つ変数を宣言するキーワードがあり、関数が呼び出されるたびに出現し、関数が戻ると消滅します。[ 2 ]すべての変数は、、、または暗黙的に関数引数として宣言する必要があります。autoextrn
C は B の後継として開発され、およびstaticキーワードがストレージクラスregister指定子として追加されました。また、およびは B から意味を引き継いでいます。ただし、C では、関数外の変数のリンケージの概念が導入されました。AC プログラムは複数のコンパイルユニットで構成され、それらをリンクして完全なプログラムを作成できます。このプログラムでは、変数または関数は、内部リンケージ(自身のコンパイルユニットのみに可視) または外部リンケージ(プログラム全体に可視) のいずれかを持つように指定できます。これらのキーワードは、ストレージ期間とリンケージの両方を次のように指定します。[ 3 ]autoextern
すべての変数と関数には、これらのストレージクラスのいずれかが割り当てられています。宣言でストレージクラスが指定されていない場合は、状況に応じたデフォルト値が使用されます。
externソースファイル内のすべてのトップレベル宣言とauto関数本体で宣言された変数について。C言語では、staticキーワード`--`は変数に使用される場合、常に静的記憶期間を持つ変数を宣言しますが、使用される場所によって、このキーワードには2つの異なる意味があります。
したがって、C言語における「静的変数」という用語には、混同しやすい2つの意味がある。
static。ストレージクラスを持つ変数(extern明示的なストレージクラスなしでトップレベルで宣言された変数を含む)は、static最初の意味では該当しますが、2番目の意味では該当しません。
C++(Cではない)では、staticキーワードを使用して、クラス内のメンバ変数をクラスオブジェクト自体の記憶期間とは独立して静的記憶期間を持つように宣言することもできます。このような変数はクラスの外で定義する必要があります。その結果、変数はすべてのクラスインスタンス間で共有され、インスタンスメンバではなくクラスメンバになります。メンバ関数(つまりメソッド)に適用すると、メンバ関数がインスタンスとは独立して動作することを指定します。つまり、クラスの非静的メンバやポインタにはアクセスできませんthis。
このstaticキーワードは、多くのプログラミング言語で、ローカル変数がプログラム全体の寿命を持ち、関数呼び出し間で保持されるように指定するために使用され、C 言語での使用法から継承された自動記憶期間のように、関数呼び出しごとに独自のコピーを持つことはありません。
static呼び出し間でローカル変数を保持するためのキーワード の使用をサポートするプログラミング言語の例としては、 C、C++、Objective-C、C#、PHP、PL/Iなどがあります。
C言語に似た構文を持つ以下のプログラミング言語は、C言語のようにローカル変数をサポートしていません。Javastatic、JavaScript 、 Dart 。これらの言語では、プログラム実行全体を通して保持される変数は、関数の外で宣言する必要があります。
C言語のキーワードstaticは、トップレベルの宣言として使用されるとき、変数または関数を自身のコンパイル単位からのみ可視にします。現代のプログラミング言語は一般的に名前の衝突を避けるために名前空間を使用するため、この使用法はC言語との互換性を念頭に置いたプログラミング言語( C++、Objective-Cなど)以外では広く採用されていません。トップレベルでの可視性宣言をサポートする他のプログラミング言語では、さまざまなレベルの可視性を指定するために、たとえばpublicJavaではどこでも使用できるクラスに、C#ではinternal/など、さまざまなキーワードが使用されます。 [ 4 ]file
このstaticキーワードは、クラスを持つほとんどのプログラミング言語で、インスタンスメンバーではなくクラスメンバーとしてメンバーを指定するために使用され、C++ の使用法から継承されています。
クラスの静的メンバーは、以下の特徴を持ちます。
this。プログラミング言語によってはさらに進んで、クラス宣言や使用箇所でキーワードを他の場所でも使用できるようにしているものもありますstatic。例えば、次のようになります。
this暗黙的に外部クラスオブジェクトへの参照を保持しており、外部クラスインスタンスのコンテキスト内で存在する必要があります。内部クラスを と宣言することでstatic、そのような参照を保持せず、外部クラスインスタンスとは独立して使用できるようになります。staticは、実際のクラス名の代わりに使用して静的メンバーにアクセスし、クラスレベルのポリモーフィズムを提供することができ、これは遅延静的バインディングと呼ばれます[ 5 ]。このキーワードは、一部のプログラミング言語において、デフォルトでキャプチャされる状態のキャプチャを防止するために、匿名関数staticで使用できます。静的クロージャは、包含する関数の実行中の呼び出しに依存しないという点で、静的ローカル変数や静的クラスメンバに似ています。
$this参照が自動的にバインドされますが、staticキーワードはこれを防止します。staticキーワードは外部の状態をキャプチャしないことを指定します。[ 6 ]