staticキーワードの特徴

2243 ワード

主に2つの側面から回答し、ストレージドメインと役割ドメイン
1.第1条も最も重要な1条である:隠す.(static関数とstatic変数の両方)
同僚が複数のファイルをコンパイルする場合、static接頭辞を付けないグローバル変数と関数はすべてグローバル可視性を有します.
例を挙げます.
2つのソースファイルを同時にコンパイルします.1つはa.cで、もう1つはmainです.c.
// a.c
char a = 'A';
void msg(){
	printf("hello
"); }
// main.c
int main(){
	extern char a;
	printf("%c",a);
	(void)msg();
	return 0;
}

プログラムの実行結果は次のとおりです.
A hello
なぜa.cで定義された局所変数aと関数msgがmain.cで使う?前述したように、static接頭辞を付けていないすべての
グローバル変数と関数にはグローバル可視性があり、他のソースファイルにもアクセスできます.この例では、aはグローバル変数であり、msgは関数であり、
いずれもstatic接頭辞を付けていないため、別のソースファイルmainに対して.cは可視です.
staticを追加すると、他のソースファイルが非表示になります.例えばaとmsgの定義の前にstatic,mainを加える.cは見えません
このプロパティを使用すると、名前の競合を心配することなく、同じ名前の関数と同じ名前の変数を別のファイルで定義できます.staticは関数と変数の
接頭辞は、関数にとってstaticの役割は非表示に限られます.
2.staticの第2の役割は、変数コンテンツの持続性を維持することである.(static変数における記憶機能とグローバル生存期間)
静的データ領域に格納された変数は、プログラムの実行が開始されると初期化が完了し、唯一の初期化です.2つの変数が格納されています
静的ストレージ領域:グローバル変数とstatic変数ですが、グローバル変数に比べてstaticは変数の可視範囲を制御できます.
PS:staticローカル変数として関数内で定義されている場合、その生存期間はソースプログラム全体であるが、その役割ドメインは自動変数と同じであり、
変数を定義する関数内で使用します.この関数を終了すると、変数はまだ存在しますが、使用できません.
#include 
int fun(){
    static int count = 10;       //             ,  a     10!     1,         ,a
    return count--;              //          ,     1   ; static   ,        ,         :    

}
int count = 1;
int main(void)
{
     printf("global\t\tlocal static
"); for(; count <= 10; ++count) printf("%d\t\t%d
", count, fun()); return 0; }

以上の2つの点に基づいて、結論を出すことができます.
局所変数を静的変数に変更すると,その記憶方式が変化し,すなわちその生存周期が変化する.グローバル変数を静的変数に変更するとその役割ドメインが変更され、
使用範囲が制限されています.そのためstaticという説明子が異なる場所で果たす役割は異なる.
3.staticの3つ目の役割は、デフォルトの初期化を0(static変数)にすることです.
4.staticの4番目の役割:c++のクラスメンバーがstaticを宣言する
クラスでstatic変数または関数を宣言する場合、初期化時に役割ドメイン演算子を使用してクラスが属することを示します.したがって、静的データメンバーはクラスのメンバーです.
オブジェクトのメンバーではなく、次のように機能します.
1)クラスの静的メンバー関数は、クラスのオブジェクトではなくクラス全体に属するため、thisポインタがなく、クラスの静的メンバーデータと静的メンバー関数のみにアクセスできるようになります.
2)静的メンバー関数を虚関数として定義できない
3)staticは,プログラムの時空コストを増加させることなく,逆にサブクラスの親クラスの静的メンバーへのアクセス時間を短縮し,サブクラスのメモリ領域を節約した.
4)静的データ・メンバーは初期化する必要があります.