3

私の知る限り、定数クラスのメンバーはコンストラクターを実行する前に初期化する必要がありますが、クラス本体では初期化できないため(単なるプロトタイプであるため)、初期化子リスト内で初期化する必要があります。私の質問は、メモリが定数変数に割り当てられるのはいつですか、実行の順序は何ですか?

class constant
{
    const int a;
    public:
    constant(int k):a(k)
    {   
        cout<<"a is "<<a<<endl;
    }   
};

int main()
{
    constant cl(5);
    return 0;
} 

編集:定数変数は、メモリが割り当てられた時点で初期化する必要があるというのは本当ですか?

4

4 に答える 4

3

私はあなたがについて間違った考えを持っていると思いますconst。実装の詳細(メモリなど)やランタイムに関連するものではなく、プログラマーやコンパイラーを支援する手段として考えてください。

メモリがいつ割り当てられるかは重要ではありません(ただし、オブジェクトを構築する前、初期化子リストに入る前-標準では指定されていません)、重要なのは、初期化子リスト(C ++より前)の変数のみを初期化できることです。 11)またはconst整数型のクラス定義ですら。

于 2012-08-08T17:13:55.503 に答える
1

いつメモリが定数変数に割り当てられますか

ここで、aは のデータ メンバであるため、 の一部としてclass constant割り当てられます。のインスタンスを作成するときはいつでも、すでに含まれています。 constantconstanta

メンバーは異なりますが、初期化後に変更することが許可されていないstaticという理由だけで、そのストレージが他の通常のデータ メンバーと異なるわけではないことに注意してください。a

...定数変数は、メモリが割り当てられた時点で初期化する必要がありますか

厳密には、コンストラクターを呼び出す前にメモリを使用できるようにする必要があるため、ポイントのフレーズは少し問題があります (特に配置についての André Caron のコメント new を参照してください)。

ただし、割り当てと構築はほとんどの通常の使用で結び付けられており、オブジェクトの構築時に const メンバーの初期化が発生する必要があります。

于 2012-08-08T17:15:13.527 に答える
1

変数が の場合const、コンパイラは、初期化後にその値を変更しないように強制します。つまり、初期化する必要があります ( RFC2119の意味で必要)。

直接初期化する必要があります。

struct constant {
  const int a;
  constant(int k) : a(k) {
    /* everything is fine here */
  }   
};

初期化せずに残してはいけません:

struct constant {
  const int a;
  constant(int k) { 
    /* error: uninitialized member ‘constant::a’ with ‘const’ type ‘const int’ */
  }   
};

また、構築後にその値を変更してはなりません。

struct constant {
  const int a;
  constant(int k) { 
    a = k; 
    /* error: uninitialized member ‘constant::a’ with ‘const’ type ‘const int’ */
    /* error: assignment of read-only data-member ‘constant::a’ */ 
  }
};
于 2012-08-08T17:38:49.143 に答える
0

オブジェクト メンバーの正確なメモリの場所は、オブジェクトの作成によって異なります。「new」でオブジェクトを作成すると、ヒープになります。(あなたの例のように)スタックオブジェクトを作成すると、それはスタックメモリになります。「定数」メモリ - 「定数変数」ではなく、「定数」用のメモリです。

つまり、const メモリはリテラル文字列、リテラル数値 ("text"、5) に使用されますが、const 修飾子はメモリの更新を制限します。

于 2012-08-08T17:16:15.940 に答える