我正在嘗試使用默認建構式創建一個非常基本的類:
class Point {
public:
Point() = default;//con 1
explicit Point(double x): x_axis(x), y_axis(0){}//con 2
Point(const Point &other) = default;
~Point() = default;
private:
double x_axis;
double y_axis;
}
當我嘗試在函式中使用默認構造main()函式時,它會生成一個隨機垃圾值x_axis:
Point p1;//generates random value
Point p2{};//works as intended
這是為什么?當我像這樣使用另一個建構式(con 2)時:
explicit Point(double x = 0): x_axis(x), y_axis(0){}
它們都按預期作業。
- 為什么,在沒有括號的第一次嘗試中,它會生成一個隨機值,但是
{}有效,但在第二次嘗試中它們都有效? - 用什么呼叫默認建構式
{}?
uj5u.com熱心網友回復:
這是因為第二個建構式用值初始化成員變數,而第一個建構式為成員變數留下不確定的值。
要么做:
class Point {
public:
Point() : x_axis{}, y_axis{} {} // instead of = default
...
或者
class Point {
public:
Point() = default;
// ...
private:
double x_axis{}; // {} or
double y_axis = 0.0; // = 0.0
};
uj5u.com熱心網友回復:
為什么在第一次嘗試中,沒有括號生成隨機值但 {} 有效,而在第二次嘗試中它們都有效
在第一次嘗試時,您寫道:
Point p1; //this uses default constructor
這里使用默認的 ctor,它只是默認初始化資料成員y_axis和y_axis. 由于這些是內置型別,因此它們具有不確定的值。
在您寫的第二次嘗試中:
Point p2{}; //this is zero initailization
以上是零初始化,意味著每個資料成員都被初始化為0.
現在,當您提供以下建構式時:
explicit Point(double x = 0): x_axis(x), y_axis(0) //this is a default constructor
{
}
上面是一個默認建構式,它0在建構式初始化串列中初始化兩個資料成員。
因此,這一次當你寫:
Point p1; //this uses the above provided default ctor
這個時間p1是使用默認 ctor 構造的,默認 ctor 將兩個資料成員都初始化為0,因此兩者x_axis和y_axis都p1將被初始化為0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/479440.html
下一篇:BOOST請求發送JSON資料
