1

オブジェクトのメンバー変数を const にできたらいいのに、システムが構築後にその const 変数の初期化を許可してくれたらいいのにと思うことがよくあります。これを可能にするメカニズムはありますか?

明確にするために、以下に例を示します。

class A
{
public:
    A(){}
    initialize(int x) { c = x; }
private:
    const int c;
}

そんなことができるようになりたいです。構築時にこの情報を持っていないため、初期化をコンストラクターの初期化リストに単純に移動することはできません。

4

1 に答える 1

4

いいえ、構築後に const メンバーを初期化することはできません。

ただし、初期化子リストで静的関数を呼び出すことができることを忘れないでください。ほとんどの場合、初期化子リストからメンバーを初期化できます。

class A
{
public:
    A(){}
    initialize(int x):c(computeC(x)) {}
private:
    const int c;
    static int computeC(int){/*...*/}
};

そのメンバーに特別なゲッターを定義し、それを使用してメンバーにアクセスすることもできます。

class A
{
public:
    A(){}
    initialize(int x) { c_internal = x; }
private:
    const int& c() const { return c_internal; }
    int c_internal;
}
于 2012-11-19T17:04:04.667 に答える