2011-08-15 10 views
0

のための異なるベースのコンストラクタを使用して:次のコードは、この順序で実行されます私の理解から派生したクラスのC++

  1. 派生コンストラクタが呼び出されます。
  2. ベースオブジェクトは、デフォルトベースコンストラクタを使用して作成されます。
  3. 派生コンストラクタの本体が実行されます。

もしそうなら、メンバーzは値を2回割り当てられていませんか?

class base { 
public: 
    int x, y, z; 
    base() {x = 0; y = 0; z = 0;}; 
}; 

class derived : public base { 
public: 
    derived() {z = 5;}; 
}; 

割り当てられるが、この場合、唯一のメンバーx及びYAの値を割り当てることになるかに、異なるコンストラクタを使用してZを残し、「派生」クラスのオブジェクトを作成するためのより効率的な方法がありますderived()の値ですか?

答えて

1

はい、zは、あなたの例では2回割り当てられています。

あなたが希望しているものを行うには、あなたが(ちょうどこことそこにいくつかの移動)、ほぼ正確に同じコードの量を必要とし、このような何か、何ができる:確かに

class base { 
public: 
    int x, y, z; 
    base(int z = 0) : x(), y(), z(z) { } 
}; 

class derived : public base { 
public: 
    derived() : base(5) { } // with this one, z is assigned 5 once 
    // or 
    derived() { } // z is assigned 0 once 
}; 
+0

+1:私はデフォルトパラメータを使用するとは思わなかった。 –

3

はい、より効率的な方法がありますが、コードが増えてメンテナンスオーバーヘッドが増えます。

class base { 
public: 
    int x, y, z; 
    // Default constructor 
    base() {x = 0; y = 0; z = 0;}; 
    // Constructor to be called if you want to override the z value 
    base(int zValue) { x=0; y=0; z=zValue; }; 
}; 

class derived : public base { 
public: 
    derived() : base(5) {}; 
}; 
+0

2秒後に私を殴る:) –

1

です。 ctor-initializerと呼ばれるものを使用します。

class base { 
public: 
    int x, y, z; 
    base(int z = 0) : x(0), y(0), z(z) {}; 
}; 

class derived : public base { 
public: 
    derived() : base(5) {} 
}; 

コード:後とコンストラクタ宣言の最初の{ctor-initializerである前に。

クラスメンバをある値に初期化できるときはいつも、必ずctor-initializerを使用する必要があります。 intの場合はそれほど重要ではありませんが、ctor-initializerを使用した初期化は、デフォルトのクラスメンバーを作成してから割り当てるよりも高速になります。

0

を、あなたはそれを行うことができます。

使用メンバー初期化リストとして:

class base { 
public: 
    int x, y, z; 
    base(int a, int b, int c) : x(a), y(b), z(c) {} 
          //^^^^^^^^^^^^^^^^^^^ it's member-initialization-list! 

}; 

class derived : public base { 
public: 
    derived() : base(0,0,5) {} 
      // ^^^^^^^^^^^ call the specific base constructor 
}; 
0

あなたが本当にbaseのメンバーの全ては一度だけ設定されたことを確認したい場合は、アンドリューの答えについては詳しく説明し、そして中可能な限り最も効率的な方法です。コンストラクタで値を設定するのではなく、メンバーリスト初期化子を使用することができます。

class base { 
public: 
    int x, y, z; 
    base() : x(0), y(0), z(0) {}; 
    base(int xval, int yval, int zval) : 
      x(xval), y(yval), z(zval) 
      { }; 
}; 

class derived : public base { 
public: 
    derived() : base(0, 0, 5) {}; 
}; 

ほとんどのコンパイラは、単にコンストラクタで値を設定すると: x(_x), ...に同じコードを生成しますが、私はしませんでしたカップルを見てきました。

関連する問題