C++クラス静的メンバーの初期化


通常、静的データメンバーはクラス宣言で宣言し、クラスメソッドを含むファイルで初期化する.初期化時にアクティブドメインオペレータを用いる静的メンバが属するクラスを指摘する.しかし、静的メンバーが整数または列挙型constの場合、クラス宣言で初期化できます!!!
#include <iostream>
using namespace std;
class test
{
public:
static int num;
};
int test::num = 0;
void main()
{
cout<<test::num <<endl;
test::num = 20;
cout<<test::num <<endl;
}

一般的に静的データメンバーは、クラス定義の外で初期化され、クラス定義の外にメンバー関数が定義されているように、この定義の静的メンバーの名前は、前例のint test::num=0のようなクラス名によって修飾されなければならない.グローバル・オブジェクトと同様に、静的データ・メンバーについてもプログラム内で1つの定義しか提供できません.これは、静的データ・メンバーの初期化がヘッダ・ファイルに置かれるべきではなく、クラスを含む非inline関数定義のファイルに置かれるべきであることを意味します.静的データ・メンバーは、constオブジェクトの配列やクラス・オブジェクトなどの任意のタイプとして宣言できます.
#include <string>
class Account {
// ...

private:
static const string name;
};
const string Account::name("Savings Account");

たとえばstringではなく文字配列でアカウントの名前を格納することを決定した場合、int型constデータメンバーで配列の長さを指定できます.
//    
class Account {
// ...
private:
static const int nameSize = 16;//  vc      
static const char name[nameSize];
};
//     
cons tint Account::nameSize;//        

const char Account::name[nameSize]="Savings Account";

この特例には、定数値を初期化する秩序化されたタイプのconst静的データメンバーが定数式constant expressionであり、クラス内でこの名前付き値を使用する必要がある場合、クラス設計者はこのような静的データメンバーを宣言することができることに注意すべき点があります.たとえばconst静的データメンバーnameSizeは定数式であるため、クラスの設計者は配列データメンバーnameの長さを指定するために使用することができ、クラス内でconst静的データメンバーを初期化するとき、そのメンバーはクラス定義の外に定義される必要がありますが、この静的データメンバーの初期値はクラスで指定されているため、したがって、クラス定義以外の定義では初期値を指定することはできません.nameは配列が秩序化されていないため、クラス内で初期化することはできません.このような動作をしようとすると、コンパイル時刻がエラーになります.たとえば、次のようにします.
class Account {
// ...
private:
static const int nameSize = 16;// ok:     
static const char name[nameSize]= "Savings Account";//   
};

nameはクラス定義の外で初期化される必要があります.この例では、メンバーnameSizeが配列nameの長さを指定し、配列nameの定義がクラス定義の外に現れることに気づきます.
const char Account::name[nameSize] = "Savings Account";
nameSizeはクラス名Accountに限定する修飾されていない.nameSizeはプライベートメンバーですが、nameの定義は間違っていません.どうしてですか.クラスメンバー関数の定義がクラスのプライベートメンバーを参照できるように、静的データメンバーの定義は静的データメンバーを参照することもできます.nameの定義は、そのクラスのドメイン内で修飾名Account::nameが表示されるとAccountのプライベートデータメンバーを参照することができます.