Fra*_*ier 5 c++ construction idioms initialization zero
考虑以下C++类:
struct Point
{
int x;
int y;
explicit Point() =default; // 1
explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};
Run Code Online (Sandbox Code Playgroud)
第二个构造函数用于创建Point具有特定值x和y值的构造函数.第一个存在,以便我可以默认构造一个Point.然而,为了提高效率,这是defaultED和不设置x和y为零.如果我确实想将所有成员设置为零,我可以有另一个构造函数:
explicit Point(int val) : x(val), y(val) { } // 3
Run Code Online (Sandbox Code Playgroud)
这样,我可以选择默认初始化Point,或者将所有成员设置为零来初始化它:
Point p1; // Don't initialize members.
Point p2(0); // Initialize all members to zero.
Run Code Online (Sandbox Code Playgroud)
第三个构造函数的问题是我可以传递任何值,而不仅仅是零.例如:
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.
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用一个表示零或默认值的特殊类型并将其传递给构造函数:
explicit Point(Default) : x(0), y(0) { } // 4
Run Code Online (Sandbox Code Playgroud)
在哪里Default可以简单地定义为:
struct Default { };
Run Code Online (Sandbox Code Playgroud)
然后,我可以控制何时Point使用默认值初始化:
Point p1; // Don't initialize members.
Point p2(Default()); // Initialize members with default values.
Run Code Online (Sandbox Code Playgroud)
哪个方法会被认为更好,具有sentinel类型的方法Default(第4号),或者构造函数采用单个值并将所有成员初始化为该值(第3个)?这两种方法的优点/缺点是什么?还是有另一种更好的机制来做到这一点?
编辑:请注意,选择这个简单的课程是为了说明; 实际上,可能会有更多成员需要特定的默认值才能被视为"初始化".
Bau*_*gen 11
让您的生活更轻松,制作像这样的简单数据结构:
struct Point
{
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
现在您可以使用聚合初始化:
Point p; // members uninitialized
Point p{}; // members set to 0
Point p{1,2}; // members set to 1,2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |