4

重複の可能性:
C++ 初期化リスト

クラスでのメンバーごとの初期化と直接の初期化の違いは何ですか? クラスで定義されている 2 つのコンストラクターの違いは何ですか?

class A
{
    public:
    int x;
    int y;
    A(int a, int b) : x(a), y(b)
    {}

    A(int a, int b)
    {
        x = a;
        y = b;
    }
};
4

2 に答える 2

6

理論的な答えは他のメンバーによって与えられています。

実用的には、メンバーごとの初期化は次の場合に使用されます。

  • クラスに参照属性( MyClass & mMyClass) があります。メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。
  • クラス ( ) に定数属性がありますconst MyClass mMyClass。また、メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。
  • クラスにデフォルトのコンストラクターがない属性がありますMyClass mMyClassコンストラクターなしMyClass::MyClass())。また、メンバーごとの初期化を行う必要があります。そうしないと、コンパイルされません。
  • とてつもなく大きなアトリビュートオブジェクト (MyClass mMyClassおよび)がありsizeof(MyClass) = 1000000000ます。メンバーごとの初期化では、一度だけビルドします。コンストラクターで直接初期化すると、2 回ビルドされます。
于 2011-07-13T17:01:37.590 に答える
5

1 つ目は初期化を使用し、2 つ目は初期化を使用せず、代入を使用します。2 番目のメンバーでは、メンバーxyが最初にデフォルトで初期化され (ゼロで)、次に と がaそれぞれ割り当てられbます。

また、2 番目のものでは、メンバーの型が重要なデフォルト コンストラクターを持っている場合にのみ、メンバーがデフォルトで初期化されることに注意してください。それ以外の場合、初期化はありません (@James がコメントで指摘したように)。

このトピックを参照してください。

于 2011-07-13T16:55:12.177 に答える