staticのC++の中のいくつかの情況

2199 ワード

1.グローバルおよびローカルの役割ドメインに存在する静的変数
1、staticで修飾されたグローバル変数は、本ファイルでのみ使用でき、他のファイルでは使用できません.
2、staticで修飾された局所変数は、関数体でのみ呼び出され、その関数を複数回呼び出す場合でも、1回だけ初期化されます.
#include 
using namespace std;

static int i = 0;    //      

void display()
{
    static int j = 0;//      
    j++;
    cout << "i = " << i << endl;
}

int main(void)
{
    i++;
    display();     //i=1;
    display();    //j = 1;
    display();    //j = 2;
    return 0;
}

2、クラス内に存在する静的データメンバー
関数内の静的変数と同様に、作成したオブジェクトは破棄されてもメモリに存在します.
#include 
using namespace std;

class A
{
public:
    A(int a)
    {
        i = a;
    }
private:
   static int i;    //          
};


int A::i = 10;     //        ,       ,         

int main(void)
{
    A a(2);
    return 0;
}


3、クラスのメンバー関数に存在する
通常の関数の役割ドメインと同様に、効果もそれほど悪くありません.
#include 
using namespace std;

class A
{
public:
    void display()
    {
        static int i = 0;
        i++;
        cout << i << endl;
    }
private:
   static int i;    //          
};


int main(void)
{
    A a;
    a.display();//i=1;
    a.display();//i=2;
    a.display();//i=3;
    return 0;
}

4、グローバルな役割ドメインに存在する静的関数
本コンパイルユニット(現在のファイル)でのみ呼び出され、他のファイルでは呼び出されず、externによって修飾されない
#include 
using namespace std;

static void display()
{
    cout << "This is a static global func" << endl;
}

int main(void)
{
    
    display();
    display();
    display();
    return 0;
}


5.クラスの静的メンバー関数に存在する静的データメンバー
(1)静的データ・メンバーは単独で初期化する必要があります.そうしないと、リンク・エラーを報告します.
(2)静的メンバー関数クラス内の非静的メンバー関数と非静的データメンバーを呼び出すことができない
(3)静的データは1部のみであり,オブジェクトに依存せずに存在する.
#include 
using namespace std;

class A
{
public:
    static void display(); //      
private:
    static int a;
    int b;
};

int A::a;   //              

void A::display()
{
    cout << a << endl;
    //cout << b << endl;                        
}

int main(void)
{
    A a;
    a.display();
    return 0;
}