web-dev-qa-db-ja.com

なぜconstメンバーは本体ではなくコンストラクタ初期化子で初期化する必要があるのですか?

なぜconstとして宣言されたクラスメンバーは、コンストラクター本体ではなく、コンストラクター初期化リストで初期化する必要があるのですか?

2つの違いは何ですか?

64
mahesh

C++では、コンストラクターの本体に入ると、オブジェクトは完全に初期化されたと見なされます。

あなたが言った:

「constが本体ではなくコンストラクタ初期化リストで初期化されなければならない理由を知りたかったのです。」

不足しているのは、初期化リストでinitialisationが発生し、コンストラクターの本体でassignmentが発生することです。ロジックの手順:

1)constオブジェクトは初期化のみ可能です。

2)オブジェクトのすべてのメンバーは、初期化リストで初期化されています。明示的に初期化しない場合でも、コンパイラは喜んで初期化します:-)

3)したがって、1)と2)を組み合わせると、constであるメンバーは、初期化時にのみ割り当てられる値を持つことができます。これは、初期化リスト中に発生します。

95
Vladimir

constおよび参照変数は、宣言された行で初期化する必要があります。

 class Something  
 {  
     private:  
      const int m_nValue;  
     public:  
      Something()  
      {  
          m_nValue = 5;  
      }  
  };

同等のコードを生成します。

const int nValue; // error, const vars must be assigned values immediately  
nValue = 5; 

コンストラクターの本体にconstまたはreferenceメンバー変数の値を割り当てるだけでは不十分です。

C++は、メンバー変数を初期化する別の方法を提供します。これにより、後で作成するのではなく、作成時にメンバー変数を初期化できます。これは、初期化リストを使用して行われます。

次の2つの方法で変数に値を割り当てることができます。明示的および暗黙的:プレーンコピーをクリップボードに表示しますか?

int nValue = 5; // explicit assignment  
double dValue(4.7); // implicit assignment  

初期化リストを使用することは、暗黙的な割り当てを行うことに非常に似ています。

基本およびオブジェクトデータオブジェクトを初期化するために使用されるメンバー初期化リストは、コンストラクターの宣言ではなく定義内にあることに注意してください。

cpp-tutorial および Code Wrangler の詳細。

9
VonC