目錄
- 1、類成員的就地初始化example
- 2、構造函數初始化
- 3、默認構造函數:Default Constructor
- 4、舉例
- 5、成員的初始化方法的優先級
1、類成員的就地初始化example
class S { int m = 7; // ok, copy-initializes m int n(7); // 錯誤:不允許用小括號初始化 std::string s{'a', 'b', 'c'}; // ok, direct list-initializes sstd::string t{"Constructor run"}; // okint a[] = {1,2,3}; // 錯誤:數組類型成員不能自動推斷大小 int b[3] = {1,2,3}; // ok// 引用類型的成員有一些額外限制,參考標準
public:S() { }
};
2、構造函數初始化
A data field is an object type (Object in Object / Embedded Object) (類的數據域是一個對象類型,被稱為對象中的對象,或者內嵌對象)
The embedded object must be constructed before the body of ctor is executed (內嵌對象必須在被嵌對象的構造函數體執行前就構造完成)
class Time { /* Code omitted */ }
class Action {
public:Action(int hour, int minute, int second) {time = Time(hour, minute, second); //time對象應該在構造函數體之前構造完成}
private:Time time;
};
Action a(11, 59, 30);
解釋time是Time的對象,是Action的內嵌對象
需要注意的地方:
在構造函數的函數體中,不可以初始化類的數據成員
構造函數的函數體執行之前,類中的數據成員必須完成初始化
3、默認構造函數:Default Constructor
默認構造函數是可以無參調用的構造函數,既可以是定義為空參數列表的構造函數,也可以是所有參數都有默認參數值的構造函數。
class Circle1 {
public:Circle1() { // 無參數radius = 1.0; /*函數體可為空*/}
private:double radius;
};
class Circle2 {
public:Circle2(double r = 1.0) // 所有參數都有默認值: radius{ r } {}
private:double radius;
};
4、舉例
class Circle {
private:double radius;
public:double getArea() {return 3.14 * radius * radius;}
};
class Square {
private:double side;
public:double getArea() {return side * side;}
};
class Combo {
private:Circle c;Square s;};int main()
{Combo o{};cout<<o.c.getArea() << endl;return 0;
}
此時,c對象是個私有的,所以不能直接訪問
有關代碼:
class Circle {
private:double radius;
public://指示編譯器生成無參構造函數Circle() = default;//構造函數Circle(double r) {radius = r;}double getArea() {return 3.14 * radius * radius;}
};
class Square {
private:double side;
public://指示編譯器不構造默認構造函數//Square() = delete;// 私有數據成員side double sideSquare(double side) :side{ side } {}//或者寫成/*Square(double side){this->side = side;}*/double getArea() {return side * side;}
};
class Combo {
public:Circle c;Square s;//構造函數.內嵌對象的構造必須在構造函數體之前就完成了Combo() :s{1.0} {}
};int main()
{Combo o{};cout<<o.c.getArea() << endl;return 0;
}
5、成員的初始化方法的優先級
一個成員同時有就地初始化和構造函數列表初始化,則就地初始化語句被忽略不執行