2016-12-04 99 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