C++クラスメンバー変数初期化位置


static:staticは静的を表します.クラスの静的メンバー関数、静的メンバー変数は、クラスの特定のオブジェクトではなく、クラスに関連しています.特定のオブジェクトがなくても、クラスの静的メンバー関数とメンバー変数を呼び出すことができます.一般的なクラスの静的関数はほとんどグローバル関数ですが、その役割ドメインはファイルに限られています.C++では、static静的メンバー変数はクラスの内部で初期化できません.クラスの内部で宣言するだけで、定義はクラス定義体の外部にある必要があります.通常、クラスの実装ファイルで初期化されます.例えば、double Account::Rate=2.25;staticキーワードはクラス定義体内の宣言にのみ使用でき、定義時にstatic staticメンバー関数として表示できない主な目的はクラス役割ドメインのグローバル関数である.クラスの非静的データ・メンバーにアクセスできません.クラスの静的メンバー関数にthisポインタがないため、1、クラスの非静的メンバー変数に直接アクセスできない、非静的メンバー関数を呼び出す2、virtual constと宣言できない:C++ではconstメンバー変数もクラス定義で初期化できない、関数初期化リストを構築することによってのみ行われ、コンストラクション関数が必要である.constデータメンバーは、あるオブジェクトの生存期間内にのみ定数であり、クラス全体に対して可変である.クラスは複数のオブジェクトを作成できるため、constデータメンバーの値が異なるオブジェクトもあります.クラスのオブジェクトが作成されていない場合、コンパイラはconstデータメンバーの値が何であるか分からないため、クラスの宣言でconstデータメンバーを初期化することはできません.constデータメンバーの初期化はクラスの構造関数の初期化リストでのみ行うことができます.クラス全体で一定の定数を確立するには、クラス内の列挙定数で実現するか、static cosntを使用します.cosntメンバー関数の主な目的は、メンバー関数がオブジェクトの内容を変更することを防止することです.すなわちconstメンバー関数では、メンバー変数の値は変更できませんが、メンバー変数にアクセスできます.メソッドメンバー関数の場合、この関数はconstメンバー関数のみです.constで定義された定数は、その役割ドメインを超えた後に解放され、staticで定義された静的定数は、関数の実行後に記憶領域を解放しません.
まとめると、初期化できるのは以下の4つの場所がある:1.クラスの定義ではconstおよびstaticおよびintegralの変数のみが行われます.2.クラスのコンストラクション関数初期化リストには、constオブジェクト、Referenceオブジェクト、および一般変数が含まれます.3、クラスの定義以外に初期化されたもので、static変数を含む.クラスに属する唯一の変数だからです.4、一般的な変数は、コンストラクション関数の内部で、付与方式で行うことができる.もちろん効率は高くありません.
class DebugDelete
{
public:
    DebugDelete(std::ostream &s = std::cerr):os(s),i(2),j(3){}  //      
    template<typename T> void operator()(T* t)const
    {
        os << "deleting ptr" << std::endl;
        std::cout << "t:" << t <<" &t:"<< &t <<" *t:" <<*t << std::endl;
        delete t;
        std::cout << "t:" << t <<" &t:"<< &t <<" *t:" <<*t << std::endl;
    }
private:
    std::ostream &os;//      ,           
    int i;//        ,         
    const int j;//           
    static int k;//             
    static const int m = 30;//                       
    static const float n ;//             
};
 int DebugDelete::k = 20;
 //const int DebugDelete::m = 30;//  
 const float DebugDelete::m = 30.0;
#endif