【C++】const,staticおよびstatic constタイプメンバー変数宣言およびその初期化

16472 ワード

1)constで定義された定数は、その役割ドメインを超えた後にその空間が解放され、staticで定義された静的定数は、関数の実行後にその記憶空間が解放されない
void f1()
{
    const int x=1;
    cout<endl;
}
void f2()
{
    static int y=2;
    cout<endl;
    y++;
}
int main()
{
    f1();//1
    f1();//1  const                     
    f2();//2
    f2();//3  static                      
}

2)static静的メンバー変数はクラスの内部で初期化することはできません.クラスの内部では宣言だけです.定義はクラス定義体の外部でなければなりません.通常、クラスの実装ファイルで初期化されます.たとえば、double Account::Rate=2.25です.staticキーワードはクラス定義体内部の宣言でのみ使用でき、外部定義ではstaticとして識別できません.
class A
{
private:

    static int x;//static           ,          

public:
    void f()
    {
        cout<endl;
    }
};

//error           static
//static int A::x=10;

int A::x=10;//        static    

int main()
{
    A a;
    a.f();//10
}

3)staticは静的を表し、クラスの静的メンバー関数、静的メンバー変数はクラスに関連し、クラスの特定のオブジェクトに関連するものではなく、特定のオブジェクトがなくてもクラスの静的メンバー関数と静的メンバー変数を呼び出すことができる.一般クラスの静的メンバー関数はグローバル関数に相当しますが、その役割ドメインはファイルに含まれるものに限定されます.
class A
{
public:
    static int x;
    static void test()
    {
        cout<<"test"<<endl;
    }
    void f()
    {
        cout<endl;
    }
};


int A::x=10;

int main()
{
    //
    cout<<:x style="color:rgb(0,128,0);">//10
    A::test();//test

    A a1;
    a1.f();//10

    A a2;
    a2.f();//10               ,     
}

4)constメンバー変数もクラス定義で初期化することはできず,コンストラクション関数初期化リストでのみ行うことができ,コンストラクション関数が必要である.
constメンバー変数は、あるオブジェクトの生存期間内にのみ定数であり、クラス全体に対して可変である.クラスは複数のオブジェクトを作成でき、異なるオブジェクトはconstデータメンバーの値が異なるため、クラスの宣言でconstデータメンバーを初期化することはできません.クラスのオブジェクトが作成されていない場合、コンパイラはconstデータメンバーの値が何なのか分かりません.
class A
{
private:
    //const int x=1;
    //const int y=2; //     :              ,               
    const int x;
    const int y;
public:
    void f()
    {
        cout<" "<endl;
    }

    A(int a,int b):x(a),y(b)//               const    ,          
    {

    };

};

int main()
{
    A a1(10,20);
    a1.f();//10 20

    A a2(11,21);
    a2.f();//11 21
}

6)constデータメンバーの初期化はクラスのコンストラクション関数の初期化リストでのみ行うことができ、クラス全体で一定の定数を確立するには、クラス内の列挙定数で実現するか、static const
class A
{
private:
    const int x;
    const int y;
public:
    void f()
    {
        cout<" "<endl;
    }
    enum{x1=100,y1=200};

    A(int a,int b):x(x1),y(y1)//             ,   a b      
    {

    };
};

int main()
{
    A a1(10,20);
    a1.f();//100 200

    A a2(11,21);
    a2.f();//100 200
}
class A
{
private:
    const int x;
    const int y;
public:
    void f()
    {
        cout<" "<endl;
    }
    static int x2,y2;

    A(int a,int b):x(x2),y(y2)//  static           ,   a b       
    {

    };
};

int A::x2=300;
int A::y2=400;

int main()
{
    A a1(10,20);
    a1.f();//300 400

    A a2(11,21);
    a2.f();//300 400
}

7)constメンバー関数の主な目的は、メンバー関数がオブジェクトの内容を変更しないようにすることです.すなわち、constメンバー関数はメンバー変数の値を変更できませんが、メンバー変数にアクセスできます.
class A
{
private:
   int x=2;
public:
    int p() const
    {
        //x=3;//error const            
        return x;//          
    }
    void f()
    {
        cout<endl;
    }

};



int main()
{
   A a1;
   cout<//2
   a1.f();//2
}

8)staticメンバー関数の主な目的は、クラスの静的メンバー関数にthisポインタがないため、クラスの役割ドメインのグローバル関数として、クラスの非静的データメンバーにアクセスできないことです.クラスの非静的メンバー変数に直接アクセスできず、非静的メンバー関数を呼び出します.虚関数として宣言できません(thisポインタがなければ、多態は実現できません.虚関数として定義するのは意味がありません)
class A
{
public:
    int x=2;
    void f()
    {
        cout<endl;
    }
    static int p()
    {
        int k=3;
        // k=x; //error              
        // f(); //error              
        return k;
    }
};

int main()
{
   A a1;
   cout<//3
   a1.f();//2
}

9)クラスのconst staticまたはstatic constメンバー変数はどこで初期化する必要がありますか?
クラスの外部で定義初期化する必要があります
class A
{
private:
    static const int x;
    const static int y;//          ,x y       
public:
    void f()
    {
        cout<" "<endl;
    }

};

const int A::x=300;//   static   ,     const   
const int A::y=400;

int main()
{
    A a1;
    a1.f();//300 400

    A a2;
    a2.f();//300 400
}