考虑以下 C++ 类:
struct Point
{
int x;
int y;
explicit Point() =default; // 1
explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};
第二个构造函数对于创建Point
具有特定x
和y
值的 a 很有用。第一个存在以便我可以默认构造一个Point
. 然而,为了效率,它被编辑并且default
不设置为零。如果我确实想将所有成员设置为零,我可以有另一个构造函数:x
y
explicit Point(int val) : x(val), y(val) { } // 3
这样,我可以选择默认初始化Point
,或者在所有成员设置为零的情况下对其进行初始化:
Point p1; // Don't initialize members.
Point p2(0); // Initialize all members to zero.
第三个构造函数的问题是我真的可以传递任何值,而不仅仅是零。例如:
Point p(1); // Both x and y set to 1! Is this the intent? If so,
// probably should have used Point p(1, 1) instead.
另一种方法是使用表示零或默认值的特殊类型并将其传递给构造函数:
explicit Point(Default) : x(0), y(0) { } // 4
其中Default
可以简单定义为:
struct Default { };
然后,我可以控制何时Point
使用默认值进行初始化:
Point p1; // Don't initialize members.
Point p2(Default()); // Initialize members with default values.
哪种方法会被认为更好,具有哨兵类型的方法Default
(第 4 号),还是采用单个值并将所有成员初始化为该值的构造函数(第 3 号)?这两种方法的优缺点是什么?还是有另一种更好的机制来做到这一点?
编辑:请注意,选择这个简单的类是为了说明;实际上,可能有更多成员需要特定的默认值才能被视为“已初始化”。