【发布时间】:2017-04-19 03:22:54
【问题描述】:
考虑以下 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。但是,为了提高效率,它是defaulted,并且不会将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 种)?这两种方法的优缺点是什么?还是有其他更好的机制来做到这一点?
编辑:请注意,选择这个简单的类是为了说明;实际上,可能有更多的成员需要特定的默认值才能被视为“已初始化”。
【问题讨论】:
-
注意,你也可以使用值初始化。
Point p{};.
标签: c++ initialization zero idioms construction