考虑以下C++类:成语初始化C++类为零
struct Point
{
int x;
int y;
explicit Point() =default; // 1
explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};
第二个构造为具有特定x
和y
值创建Point
有用。第一个存在以便我可以默认构建一个Point
。但是,为了提高效率,它是default
ed,并且不会将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
(no。 4),还是只有一个值并将所有成员初始化为该值(3号)的构造函数?这两种方法的优点/缺点是什么?还是有另一个更好的机制来做到这一点?
编辑:请注意,这个简单的类被选作说明;在现实中,可能有更多的成员,其需要特定的默认值被视为“初始化”。
请注意,您也可以使用值初始化。 'Point p {};'。 – juanchopanza