我不是筆記的創造者,我只是筆記的搬運工~
1 ,構造函數可以重載,也可以帶有缺省參數
匹配string的無參構造函數
string s;
匹配string的有參(const char*)構造函數
string s("hello");
2 ,缺省構造函數(無參構造函數)
1)如果類中沒有定義任何構造函數,編譯器會爲該類提供一個缺省(無參)構造函數:
--》對於基本類型成員變量不做初始化
--》對於類 類型的成員變量(成員子對象),將會自動調用相應類的無參構造函數來初始化
2)如果自己定義了構造函數,無論是否有參數,那麼編譯器都不會再提供缺省的無參構造函數了.
3 ,類型轉換構造函數(單參構造函數) //構造函數的類型轉換
class 類名{
//可以將源類型變量轉換爲當前類類型對象.
類名(源類型){...}
};
-----------------------------------
class 類名{
//加“explicit”關鍵字修飾,可以強制要求這種類型
//轉換必須顯式的完成.
explicit 類名(源類型){...}
};
4, 拷貝構造函數(複製構造函數) 這部分我覺得還挺難理解的
1)用一個已存在的對象作爲同類對象的構造實參,創建新的副本對象時,會調用該類拷貝構造函數。
class 類名{
類名(const 類名&){//拷貝構造
...
}
};
------------
eg:
class A{...};
A a1(...);
A a2(a1);//匹配A的拷貝構造函數
2)如果一個類沒有自己定義拷貝構造函數,那麼編譯器會爲該類提供一個缺省的拷貝構造函數:
--》對於基本類型的成員變量,按字節複製
--》對於類類型的成員變量(成員子對象),將自動調用相應類的拷貝構造函數來初始化
注:一般不需要自己定義拷貝構造函數函數,因爲編譯器缺省提供的已經很好用了.
class A1{};//缺省無參,缺省拷貝
class A2{//缺省拷貝
A(void){}
};
class A3{//缺省拷貝
A(int){}
};
class A4{//沒有缺省構造
A(const A&){}
};
3)拷貝構造函數調用時機
--》用一個已存在對象作爲同類對象的構造實參
--》以對象形式向函數傳遞參數
--》從函數中返回對象(有可能被編譯器優化掉)