考慮以下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