2016-12-04 74 views
4

考虑以下C++类:成语初始化C++类为零

struct Point 
{ 
    int x; 
    int y; 

    explicit Point() =default; // 1 
    explicit Point(int x_, int y_): x(x_), y(y_) { } // 2 
}; 

第二个构造为具有特定xy值创建Point有用。第一个存在以便我可以默认构建一个Point。但是,为了提高效率,它是default ed,并且不会将xy设置为零。如果我想所有成员设置为零,我可以有另一种构造:

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号)的构造函数?这两种方法的优点/缺点是什么?还是有另一个更好的机制来做到这一点?

编辑:请注意,这个简单的类被选作说明;在现实中,可能有更多的成员,其需要特定的默认值被视为“初始化”

+1

请注意,您也可以使用值初始化。 'Point p {};'。 – juanchopanza

回答

10

让您的生活更轻松,使简单的数据结构像这样聚集:

struct Point 
{ 
    int x; 
    int y; 
}; 

现在你可以使用集合初始化:

Point p;  // members uninitialized 
Point p{}; // members set to 0 
Point p{1,2}; // members set to 1,2 
2

,我看到这种情况的最常见的做法是实现与包含设置为你想要的任何默认值类的每一个成员的初始化列表中的无参数的构造函数。

Point(): x(0), y(0) { } 

这背后的原因是,你可能永远都不想实例化对象没有成员初始化为某些已知值,这样你就不会真正想要的是默认的构造函数存在。

+0

我认为这是'std :: complex'采取的方法。 –

0

另一种选择是使用:

struct Point 
{ 
    int x; 
    int y; 

    explicit Point(int x_ = 0, int y_ = 0): x(x_), y(y_) {} 
}; 

Point p1;  // 0, 0 
Point p2(1);  // 1, 0 
Point p3(1, 10); // 1, 10