构造函数中私有成员初始化的差异(C++)

Difference in Private Member Initializations in Constructor (C++)

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

注意:

int data[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};
 }

最终结果有区别吗?

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

  • 如果成员是const或引用,必须在初始化列表中初始化,不能在构造函数体中初始化

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

  • 如果对象是 "big and expensive" 来创建和赋值,那么你可能会在默认构造对象然后在其上使用赋值运算符的情况下做一些低效的事情。 (而不是同时用它的初始值构造它。)

对于整数和基本类型,像您描述的默认构造这样的 POD 类型是微不足道的,因此考虑到上述对引用、const 等的限制,任何一种方式都是等效的