69

constコンストラクター本体ではなく、コンストラクター初期化子リストでクラスメンバーを初期化するように宣言する必要があるのはなぜですか?

2つの違いは何ですか?

4

3 に答える 3

100

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

あなたが言った:

「const を本体ではなく、コンストラクター初期化子リストで初期化する必要がある理由を知りたいですか?」

あなたが見逃しているのは、初期化リストで初期化が行われ、コンストラクターの本体で割り当てが行われることです。ロジックの手順:

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

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

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

于 2008-12-10T07:01:22.537 に答える
9

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 または参照メンバー変数の値を割り当てるだけでは不十分です。

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

次の 2 つの方法で変数に値を割り当てることができます: 明示的および暗黙的: view plaincopy to clipboardprint?

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

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

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

cpp-tutorialCode Wranglerの詳細。

于 2008-12-10T06:57:16.553 に答える
-2

定数変数と参照は、宣言時、つまり使用前に初期化する必要があるためです。ただし、コンストラクターは変数に値を割り当て、変数を初期化しないため、定数と参照には initailizier リストを使用する必要があります

于 2016-08-12T09:05:28.203 に答える