我有一堂课,我必须实例化很多次。它是这样的:
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 ...)。
编译器:Intel和LLVM。
答案 0 :(得分:2)
第一种方式是你唯一的选择。您的第二个“选项”将无效,因为a1
和a2
在基类中声明,因此无法在B
的初始化列表中初始化。
原因是它们属于A
,因此初始化它们是A
的责任,并且将在A
的构造函数中完成,这是在任何其他初始化发生之前在B
。无论你做什么,总会有A
的构造函数被称为构造B
对象的第一步。即使你以某种方式可以避免这种情况并直接从B
初始化成员,也没有理由期望实际的性能提升。
答案 1 :(得分:0)
您无法在派生类的初始化列表中初始化基类的成员。第二个不会编译。
你必须选择调用A
个构造函数中的哪一个;如果您提及none,则会自动调用默认的A()
。没有办法不调用基类构造函数。