0

我有一门课,我必须实例化很多次。是这样的:

class A
{
  public:

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

  float a1;
  int   a2;
};

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

我有两种方法来实现 B 的 ctor:

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 ...)。

编译器:英特尔和 LLVM。

4

2 回答 2

2

第一种方式是您唯一的选择。您的第二个“选项”将不起作用,因为a1anda2是在基类中声明的,因此无法在B.

原因是它们属于A,因此初始化它们是 的责任,A并且将在 的构造函数中完成A,这是在任何其他初始化发生之前B。无论你做什么,总会有一个被调用的构造函数作为构造对象A的第一步。B即使您以某种方式可以避免这种情况并直接从 初始化成员B,也没有现实的理由期望性能得到实际改进。

于 2013-04-19T11:37:04.043 回答
1

不能在派生类的初始化列表中初始化基类的成员。第二个不会编译。

您必须选择A将调用哪个构造函数;如果您没有提及,A()则会自动调用默认值。没有办法不调用基类构造函数。

于 2013-04-19T11:37:17.243 回答