9
class Node
{
public:

    Node *parent; // used during the search to record the parent of successor nodes
    Node *child; // used after the search for the application to view the search in reverse

    float g; // cost of this node + it's predecessors
    float h; // heuristic estimate of distance to goal
    float f; // sum of cumulative cost of predecessors and self and heuristic

    Node() :
            parent( 0 ),
            child( 0 ),
            g( 0.0f ),
            h( 0.0f ),
            f( 0.0f )
    {
    }

    UserState m_UserState;
};

コンストラクターを使用する理由

    Node() :
            parent( 0 ),
            child( 0 ),
            g( 0.0f ),
            h( 0.0f ),
            f( 0.0f )
    {
    }

それ以外の

    Node()
    {
        parent = null;
        child = null;
        g = 0.0f;
        h = 0.0f;
        f = 0.0f;
    }

ありがとう :)

4

5 に答える 5

14

プレーン オールド データ (POD) の場合、これはほとんどメリットがありませんが、参照を使用するか、クラスを作成し始めると、違いが生じます。

class Foo {
    Bar bar;

  public:
    // construct bar from x
    Foo(int x) : bar(x) { }
};

Foo::Foo(int x)
{
    // bar is default-constructed; how do we "re-construct" it from x?
    bar = x;  // requires operator=(int) on bar; even if that's available,
              // time is wasted default-constructing bar
}

クラスが setter またはoperator=. constメンバーは確かに「再構築」またはリセットできません。

class FooWithConstBar {
    const Bar bar;

  public:
    Foo(int x) {
        // bar is cast in stone for the lifetime of this Foo object
    }
};

編集:参照の問題を指摘してくれた@Vitusに感謝します。

于 2011-04-19T10:22:01.023 に答える
6

実際に必要な、またはパフォーマンス上の理由から、初期化リストを使用してメンバーを初期化する必要がある状況があるため、一貫性を保ち、常にそれを使用する必要があります。

初期化リストを使用する必要がある例は、集約にデフォルトのコンストラクターがない場合、または const メンバーがある場合です (はい、一般的ではありませんが、許可されています)。

初期化リストを使用する必要がある (強制されない)例は、集約オブジェクトがあり、次の点が有効な場合です。

  • 集約にはデフォルトのコンストラクターがあります。
  • デフォルト以外の値でオブジェクトを設定する必要があります。
  • 集約には、必要なデフォルト以外の値を設定できるコンストラクターがあります。

では、なぜ使用してはいけないのでしょうか。

于 2011-04-19T10:49:06.110 に答える
3

初期化リストを優先

于 2011-04-19T10:33:45.533 に答える
2

主にパフォーマンスの問題が原因です。

ここで議論されています。

于 2011-04-19T10:23:53.600 に答える
1

主な理由は、オブジェクトの有効性とクラスの不変条件です。もう一つの理由は、使いやすさです。

すべてをコンストラクターに入れると、コンストラクターが終了すると、有効なノードが保証されます。すべてのインスタンス変数を個別に設定する必要がある場合、プログラマーが忘れたか、割り当ての 1 つが例外をスローしたために、いくつかの変数が初期化されていないノードを持つことができます。後者はあなたの場合には発生しませんが、一般的には発生する可能性があります。Node が完全に初期化されていない場合、その動作が期待どおりであるとは保証できません。

于 2011-04-19T10:26:18.973 に答える