8

クラスの定数データメンバーをコンストラクターで初期化する必要がある理由と、他の場所で初期化しない理由を知りたいですか? そうすることとそうしないことの影響は何ですか?

また、クラス内で初期化できるデータ メンバー以外は、クラス内で静的定数整数データのみを初期化できることもわかります。

例:- 以下が私のクラス宣言であるとします

class A{
     int a; // This we can initialize at the constructor or we can set this member by calling "vSet" member function
     const int b;
     static const int c = 10; //This works fine
public:
     A();
     ~A();
     void vSet(int a);
     int iAdd();
     void vDisplay();    
};

そして、コンストラクターは以下のように定義されています:-

編集されたセクション: 前のコンストラクター定義の例が間違っていたため

 A::A():a(1),b(9){}

間違っている場合は修正してください。前もって感謝します。

4

7 に答える 7

13
A::A(){
      a = 1;
      b = 9; // Why we need to initialize this only at the constructor. 
   }

初期化ではなく代入です。
aおよびbは既に構築されており、この場合はそれらに値を割り当てます。修飾子はconst、初期化後に変数を変更しないことを要求します。この割り当てを許可すると、その契約が破られます。

これは、メンバー初期化リストを使用した初期化です。

A::A():a(1),b(9)
{}

違いを知るために、私のこの答えを見たいと思うかもしれません:

コンストラクター内の初期化と代入の違いは何ですか?


別の質問については、 class 内で初期化できるのは static 定数の整数データのみに関するものです。詳しく説明している私の回答を読んでください。

クラスで非 const 静的メンバーまたは静的配列を初期化できないのはなぜですか?

于 2012-05-18T06:01:32.383 に答える
9

あなたがしているのは初期化ではありません。これは代入であるためコンパイルb=9さえされません。初期化する必要があります。そのためには、メンバー初期化リストを次のように使用します。bconst

A::A() : a(1), b(9) 
{   // ^^^^^^^^^^^^ this is called member-initialization list

}

C++11 では、インプレース初期化を次のように使用できます。

class A{

     int a = 1;       //C++11 only
     const int b = 9; //C++11 only

     static const int c = 10; //This works fine (both in C++03 and C++11)
     //...
};
于 2012-05-18T06:01:13.367 に答える
6

定数であるため、値を変更することはできません。コンストラクター以外の場所で初期化すると、デフォルトの初期化が行われ、その後に代入が行われますが、これは定数には許可されていません。これは、次のことと同じです。

const int i; // OK
i = 42; // Error!

C++11 では、これを実行してもまったく問題ないことに注意してください。

struct Foo {

  const int i=42;
  const double x = 3.1416;
};

ただし、これは同じ規則に従います。つまり、代入はありません。

于 2012-05-18T06:01:55.580 に答える
3

const データは、決して変更できないデータです。一度初期化されると、同じ値を永久に保持します。

そのため、どこにでも値を割り当てることはできません。

ただし、コンストラクターは初期化が行われる場所です。したがって、ここでは例外があり、const データに値を割り当てることができます。これは古典的な方法、または多くの人が言うように、初期化リストとして行うことができます。

さて、変数が静的でない場合にクラス定義でこれを行うことができないのはなぜですか (たとえば、Java とは異なり)、別の問題であり、私には答えがわかりません。

于 2012-05-18T06:05:04.263 に答える
2

コンストラクターの本体に入ると、すべてのメンバーとサブオブジェクトが既に初期化されています。コンストラクター本体ができる唯一のことは、それらを変更することです。これは、明らかに、constメンバーには許可されていません。

ただし、初期化リストを使用することはできます。

于 2012-05-18T06:02:57.397 に答える
1

const 値は右辺値であることを意図しているため、constness のために式の右側に表示することはできません。

したがって、コンストラクターの本体でこの式を使用すると、

A::A()
{
    a = 1;
    b = 9; // Why we need to initialize this only at the constructor. 
}

Als が前に述べたように、const 値を左辺値として使用しています。事実は、変数に新しい値を代入しようとしているということです。その変数は、寿命が始まった後にその値を変更することはできません。

定数データ メンバーに値を割り当てる正しい方法は、ctor 初期化子リストにあります。つまり、メンバー値の有効期間が始まる前です (Nawaz が述べているように)。

A::A() :
    a(1),
    b(9)
{
}

最後に、C++11 標準では、 static const と同様に、宣言されたすべてのデータ メンバーを初期化できます。

于 2012-05-18T06:19:12.497 に答える
1

メンバーはconstconstであるため、コンストラクターの外で初期化することはできません。定義上、初期化後にオブジェクトを変更することはできません。オブジェクトが構築された後は、値を設定しようとすることはすべて変更になります。

于 2012-05-18T06:02:50.720 に答える