0

私は何回もインスタンス化する必要があるクラスを持っています。それは次のようなものです:

class A
{
  public:

  A() : a1(0.0f), a2(-1) {}

  float a1;
  int   a2;
};

class B : public A
{
  B();
  float b;
};

B の ctor を実装する 2 つの方法を念頭に置いています。

B(): A(), b(0.0f) {} // Using the base class ctor.

B(): b(0.0f) { a1 = 0.0f; a2 = -1; } // Not using the base class ctor. Ugly but maybe faster?

どちらが速いですか?

私のメンバー型は、基本クラスと継承クラスの両方で基本 (int、float、double...) です。

コンパイラ: Intel および LLVM。

4

2 に答える 2

2

最初の方法が唯一の選択肢です。とが基本クラスで宣言されているためa1、2 番目の「オプション」は機能しません。a2B

理由は、それらが に属しているためA、それらの初期化は の責任でAあり、 のコンストラクターで行われます。Aこれは、 で他の初期化が行われる前Bです。何をするにしても、オブジェクトAを構築する最初のステップとして呼び出されるコンストラクターが常に存在しBます。何らかの方法でこれを回避し、 から直接メンバーを初期化できたとしてもB、実際のパフォーマンスの向上を期待する現実的な理由はありません。

于 2013-04-19T11:37:04.043 に答える
1

派生クラスの初期化リストで基本クラスのメンバーを初期化することはできません。2 番目のものはコンパイルされません。

Aのコンストラクターのどれを呼び出すかを選択する必要があります。none を指定すると、デフォルトA()が自動的に呼び出されます。基本クラスのコンストラクターを呼び出さない方法はありません。

于 2013-04-19T11:37:17.243 に答える