调用基类构造函数vs初始化Child类中的成员变量
问题描述:
Parent
类是一个抽象类。这里的_isDone
,_prob
是Parent
类别的protected
变量,它们由Child
继承。调用基类构造函数vs初始化Child类中的成员变量
是什么两者的区别:用于初始化Parent
类的变量
Child::Child(int _classType) : Parent(false, 1.0f)
。
与
Child::Child(int _classType)
{
_isDone = false;
_prob = 1.0f;
}
我觉得这是更容易使用的第二而非第一。任何理由使用第一个。
答
简短的回答:第一种是初始化,而第二个是分配。
第一个用Parent
的构造函数初始化_isDone
和_prob
。但是,当您使用第二个函数时,_isDone
和_prob
将使用Parent
的默认构造函数进行初始化,然后在Child
构造函数的函数体中为它们分配新值。
第一个是由于以下原因,更好地:
- 如果
Parent
没有默认的构造函数,第二个不能工作。 - 第一个效率更高,尤其是当数据成员是一个“非常大”的对象时,其默认构造函数非常昂贵。由于第一个调用数据成员的默认构造函数,然后调用
operator=
来分配一个新值,而第二个调用一个正确的构造函数。默认的构造函数是多余的。 - 个人而言,我认为直接访问
Parent
的数据成员不是一个好主意:在Parent
和Child
之间的耦合增加。