构造函数初始化器列表与头文件中的初始化

时间:2018-08-30 07:38:13

标签: c++ constructor initialization

在代码库中,我正在使用数十个标头初始化变量:

bool toBeTrue = true;
int var = 1;

如果它们没有在头文件中初始化,则在构造函数的主体中初始化:

MyClass::MyClass()
{
 variable1 = 10;
 boolean2 = false;
};

初始化头文件中的变量是否有意义(也许在头文件中将指针初始化为nullptrbooleans和简单的ints)会使编译时间变慢?并将所有变量初始化移动到构造函数的初始化列表中会加快编译时间吗?

1 个答案:

答案 0 :(得分:1)

此:

MyClass::MyClass()
{
 variable1 = 10;
 boolean2 = false;
};

不是初始化!成员将在构造函数的主体运行之前被初始化,然后您要分配值。您的意思可能是两者之间的区别

启动器列表

MyClass::MyClass() : variable1(10), boolean2(false) {}

并在标头中进行类初始化(我相信C ++ 11起可用):

struct MyClass {
     int variable1 = 10;
     boolean2 = false;
};

在最后两种情况下,这些值都用于初始化成员,因此速度没有差异。但是,在第一种情况下,您所做的事情超出了您实际想要的(初始化+赋值),因此,如果可能,应该避免这样做。

类内初始化和初始化列表(例如,here)之间的细微差别是

variable1 = 10; 

可能涉及副本。这可以通过使用直接列表初始化来避免:

 struct MyClass {
     int variable1{10};
     bool boolean2{false};
};

但是,对于intbool来说,这没有任何区别。