C/C++におけるstaticキーワードの役割概要

4430 ワード

1.まず最初に紹介するのも最も重要な1つです.隠すことです.(static関数、static変数はいずれも可能)複数のファイルを同時にコンパイルする場合、static接頭辞を付けないグローバル変数と関数はすべてグローバル可視性を有する.例を挙げて説明する.2つのソースファイルを同時にコンパイルする.1つはa.c、もう1つはmain.cである.
 
  
//a.c
char a = 'A';               // global variable
void msg()
{
     printf("Hello
");
}
 
  
//main.c

int main()
{
     extern char a;       // extern variable must be declared before use
     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は変数の可視範囲を制御することができ、結局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;
}

プログラムの実行結果は次のとおりです.
 
  
global  local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1

--上記の2点に基づいて、局所変数を静的変数に変更すると、その記憶方式が変更され、生存期間が変更されるという結論が得られる.グローバル変数を静的変数に変更すると,その役割ドメインが変更され,その使用範囲が制限される.そのためstaticという説明子が異なる場所で果たす役割は異なる.
3.staticの3つ目の役割は、デフォルトの初期化を0にすることです.(static変数)実はグローバル変数もこの属性を備えています.グローバル変数も静的データ領域に格納されているからです.静的データ領域では、メモリ内のすべてのバイトのデフォルト値が0 x 00で、プログラマーの作業量を減らすことができる場合があります.たとえば、疎マトリクスを初期化すると、すべての要素を1つずつ0にして、0ではないいくつかの要素を要素の割り当て.静的に定義すると、最初に0を置く操作が省けます.例えば、1つの文字配列を文字列として使うが、文字配列の末尾に「0」をつけるたびに、面倒くさい.文字列を静的に定義すれば、そこはもともと「0」だったので、この面倒を省くことができます.小さな実験をして検証してみてはいかがでしょうか.
 
  
#include

int a;

int main()
{
     int i;
     static char str[10];
     printf("integer: %d; string: (begin)%s(end)", a, str);
     return 0;
}


プログラムの実行結果は次のとおりです.
 
  
integer: 0; string: (begin) (end)

最後にstaticの3つの役割について一言でまとめます.
まずstaticの最も主要な機能は非表示であり、次にstatic変数が静的記憶領域に格納ため、持続性とデフォルト値0.4を備えている.staticの4番目の役割:C++のクラスメンバー宣言static(上記の役割と重なる場合がある)クラスでstatic変数または関数を宣言する場合、初期化時に役割ドメイン演算子を使用してクラスが属することを示すため、静的データメンバーはオブジェクトのメンバーではなくクラスのメンバーであり、次のような役割を果たします.
(1)クラスの静的メンバー関数はクラス全体ではなくクラス全体に属するオブジェクトであるため、thisポインタがなく、クラスの静的データと静的メンバー関数のみにアクセスできるようになる.     
(2)静的メンバー関数を虚関数として定義することはできない.     
(3)静的メンバはクラスに宣言され,その外で動作するため,アドレスを取る操作は多少特殊であり,変数アドレスはそのデータ型を指すポインタであり,関数アドレスタイプは「nonmember関数ポインタ」である.
(4)静的メンバ関数にはthisポインタがないため,差がnonmember関数に等しくない結果,callback関数となり,C++とC-based X W indowシステムを結合するとともにスレッド関数への応用に成功するという予想外の利点が生じた.(これは出会ったことがない)
(5)staticはプログラムの時空オーバーヘッドを増加させず,逆にサブクラスの親クラスの静的メンバーへのアクセス時間を短縮し,サブクラスのメモリ領域を節約した.     
(6)静的データメンバーは,時の前にキーワードstaticを付ける.     
(7)静的データメンバは静的に格納されているので,初期化する必要がある.(プログラマは手動で初期化します.そうしないとコンパイル時にエラーは報告されませんが、Linkでエラーが報告されます)
(8)静的メンバー初期化は、一般的なデータメンバー初期化とは異なります.
初期化はクラス外で行われ、一般的な静的変数やオブジェクトと混同されないようにstaticは加算されません.初期化時にそのメンバーのアクセス権制御子private、publicなどを追加しない.初期化時に役割ドメイン演算子を使用して、その属するクラスを明記します.静的データ・メンバーの初期化のフォーマット:::=
(9)親の影響を防ぐために、親と同じ静的変数を子クラスに定義して、親の影響を遮断することができます.ここで注意する必要があります.静的メンバーは親と子の共有ですが、静的メンバーを繰り返し定義しています.これはエラーを引き起こすのではないでしょうか.いいえ、私たちのコンパイラは絶妙な手法を採用しています.name-manglingは唯一のフラグを生成するために使用されます.