2

コードのバグが原因でこれに遭遇しましたが、なぜ許可されているのか興味があります。オブジェクトメンバーをコンストラクター初期化リストに表示できるようにする理由は何ですか?

#include <stdio.h>

class derived {
  private:
    int * value2;
  public:
    derived();
};

derived::derived()
 : value2(value2){} // Uninitialized self-assignment

int main()
{
  derived thisChild;
}

Clangはこれについて警告を出しますが、残念ながらg++は警告を出しません。

4

4 に答える 4

3

したがって、あるメンバーを別のメンバーを使用して初期化できます。もう一方がすでに初期化されている場合、またはそのアドレスを使用してポインタまたは参照を初期化するだけの場合、これはまったく問題ありません。例えば:

struct Thingy
{
    int & r;
    int a;
    int b;

    Thingy(int x) :
        r(a),   // OK - a has a valid address, and we're not using the value
        a(x),
        b(a)    // OK - a has been initialised
    {}
};

それを許可し、あなたの例を許可しないのはかなり難しいでしょう。

于 2012-06-18T17:42:26.800 に答える
2

表示されていない場合は、次のように書くことはできません。

A(int n) : some_num(n), another_num(some_num*10) {}

では、メンバー初期化リストのポイントは何でしょうか?

自己初期化(初期化されていない変数)に関しては、次のことも実行できます。

int xyz = xyz; //will compile
于 2012-06-18T17:41:37.720 に答える
0

初期化リストはメソッドの本体(具体的にはコンストラクター)の一部と考えることができるため、そのメソッドの1つでオブジェクトのメンバー変数にアクセスできるのは当然です。

また、作成済みのメンバー変数を再利用して他のメンバーを初期化することもできます-:これを移植可能に使用していることを確認するには、初期化の正確な順序(メンバー変数宣言の順序)を知る必要があります

于 2012-06-18T17:40:54.290 に答える
0

イニシャライザ式でメンバー変数にアクセスできるのはなぜかということだと思います。

1つの理由は、あるメンバー変数の初期化が別のメンバー変数に依存する可能性があることです。

これは壊れやすいですが、人工的な基本クラスなどの厄介なコードを避けるために必要な場合があります。

于 2012-06-18T17:43:20.823 に答える