C++クラスの静的メンバー初期化の詳細
2483 ワード
通常、静的データメンバーはクラス宣言で宣言し、クラスメソッドを含むファイルで初期化する.初期化時にアクティブドメインオペレータを用いる静的メンバが属するクラスを指摘する.しかし、静的メンバーが整数または列挙型constの場合、クラス宣言で初期化できます!!!
一般的に静的データメンバーは、クラス定義の外で初期化され、クラス定義の外にメンバー関数が定義されているように、この定義の静的メンバーの名前は、前例のようなクラス名によって修飾される必要がある.
int test::num = 0;
グローバル・オブジェクトと同様に、静的データ・メンバーについてもプログラム内で1つの定義しか提供できません.これは、静的データ・メンバーの初期化がヘッダ・ファイルに置かれるべきではなく、クラスを含む非inline関数定義のファイルに置かれるべきであることを意味します.静的データ・メンバーは、constオブジェクトの配列やクラス・オブジェクトなどの任意のタイプとして宣言できます.
たとえばstringではなく文字配列でアカウントの名前を格納することを決定した場合、int型constデータメンバーで配列の長さを指定できます.
この特例では、定数値を初期化する秩序化されたタイプのconst静的データメンバーは、定数式constant expressionであり、クラス内でこの名前付き値を使用する必要がある場合、クラス設計者は、このような静的データメンバーを宣言することができる.たとえばconst静的データメンバーnameSizeは定数式であるため、クラスの設計者は配列データメンバーnameの長さを指定するために使用することができ、クラス内でconst静的データメンバーを初期化する際に、そのメンバーをクラス定義の外に定義する必要があります.
ただし、この静的データ・メンバーの初期値はクラスで指定されているため、クラス定義以外の定義では初期値を指定できません.nameは配列が秩序化されていないため、クラス内で初期化できません.このような動作をしようとすると、コンパイル時のエラーが発生します.たとえば、次のようになります.
nameはクラス定義の外で初期化される必要があります.この例では、メンバーnameSizeが配列nameの長さを指定し、配列nameの定義がクラス定義の外に現れることに気づきます.
const char Account::name[nameSize] = "Savings Account";
nameSizeはクラス名Accountに限定する修飾されていない.nameSizeはプライベートメンバーですが、nameの定義は間違っていません.どうしてですか.クラスメンバー関数の定義がクラスのプライベートメンバーを参照できるように、静的データメンバーの定義は静的データメンバーを参照することもできます.nameの定義は、そのクラスのドメイン内で修飾名Account::nameが表示されるとAccountのプライベートデータメンバーを参照することができます.
#include
using namespace std;
class test
{
public:
static int num;
};
int test::num = 0;
void main()
{
cout<<:num>test::num = 20;
cout<<:num>}
一般的に静的データメンバーは、クラス定義の外で初期化され、クラス定義の外にメンバー関数が定義されているように、この定義の静的メンバーの名前は、前例のようなクラス名によって修飾される必要がある.
int test::num = 0;
グローバル・オブジェクトと同様に、静的データ・メンバーについてもプログラム内で1つの定義しか提供できません.これは、静的データ・メンバーの初期化がヘッダ・ファイルに置かれるべきではなく、クラスを含む非inline関数定義のファイルに置かれるべきであることを意味します.静的データ・メンバーは、constオブジェクトの配列やクラス・オブジェクトなどの任意のタイプとして宣言できます.
#include
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のプライベートデータメンバーを参照することができます.