2017-09-05 167 views
1

我已经离开C++一段时间了,我试图确定定义类的私有成员变量(如果有的话)的这两个默认构造函数初始化的区别。类定义位于头文件中,而实现位于单独的文件中。所有私有成员变量都需要初始化为“0”或无意义的值。构造函数中私人成员初始化的差异(C++)

注:

int数据[MAX_SIZE]的大小是固定的编译时间阵列。 int used:是数组的索引跟踪器。

一般来说,我习惯了通过以下方式初始化成员:

// Default Constructor 
IntSet::IntSet() 
{ 
    data[MAX_SIZE-1] = {0} 
    used = 0; 
} 

我通过一些遗留代码梳理和寻找一种完全不同的语法:

// Default Constructor 
IntSet::IntSet() : used(0) 
{ 
    data[MAX_SIZE-1] = {0}; 
} 

有最终结果的差异?

+0

在你的第二个片段中使用[初始化程序列表](http://en.cppreference.com/w/cpp/language/initializer_list)。在C++中不允许使用VLA。 – Ron

+0

这里没有使用VLA。所做的就是将'data'的最后一个值设置为0. – user4581301

回答

5

成员在构建时被初始化,之前达到构造函数的主体。有些情况下他们有所不同。例如:

  • 如果一个成员是常量或参考,它必须可以在初始化列表中初始化,并且不能在构造体

  • 如果部件不具有默认的构造进行初始化(或者你没有访问它),那么你必须提供它应该使用一些参数的构造函数,并且只能在初始化器列表中完成。

  • 如果对象“创建并分配给对象是”大而昂贵“,那么默认情况下可以通过构造对象然后对其使用赋值运算符来做低效率的事情。 (而不是在同一时间与它的初始值构成它。)

对于像您所描述默认结构是微不足道的,因此任何一种方式是等效的整数和原始的,POD类型,鉴于对参考上述限制, const等。

+0

附录:有关[成员初始值列表](http://en.cppreference.com/w/cpp/language/initializer_list)的更多阅读内容 – user4581301

+0

感谢解释和参考其他读物。真的很感激它!有没有更好的方法来初始化数组的每个元素为NULL值,同时也将“used”设置为“0”? –

+0

@AlexanderMaxwell您无法在构造函数初始值设定项列表中初始化数组。为此,您必须使用for循环或等效循环来将每个元素初始化为NULL。 –