C++基礎4:構造函數、析構函數、拷貝析構函數、靜態成員函數

【構造函數】
1.1構造函數:一個特殊的函數與類型名相同,沒有返回值類型,保證創建一個對象時,自動調用一次,一個類可以有多個構造函數
作用:初始化對象
如果一個類不提供構造函數,則系統自動提供一個無參構造函數,但一旦提供構造函數,則系統的無參構造自動消失。

1.2一個對象的創建過程
根據對象大小,分配內存,如果類的成員變量是基本類型,則什麼都不做;如果是類類型的成員,則去構造它,調用這個類的構造函數

1.3初始化參數列表
當類型中有const成員,或者引用類型的成員,需要在構造函數調用之前賦值,在構造函數參數列表之後,實現體之前的位置是初始化參數列表
注:構造函數可以直接賦值:
class A{
    const int a;
    int b;
    int &c;
public:
    A(int oc):a(123),b(99),c(*new int(oc)){
        //a = 100;
        //b = 200;
        cout<<a<<","<<b<<","<<c<<endl;
    }
};
int main()
{
    A a(111);

 

}

 

 

【析構函數】
2.1析構函數:一個特殊的函數,和類名相同,但是函數名之前有一個~,不能有任何的參數,也沒有返回值類型,在對象被銷燬前自動調用一次

2.2什麼時候需要自定義析構函數
對象銷燬時,需要釋放資源,一般是有動態內存分配時

2.3在構造函數中或者初始化參數列表中爲指針類的成員變量分配了內存,在析構函數中釋放掉動態分配的內存

2.4構造函數和析構函數的調用順序:先構造後析構

 

【拷貝構造函數】
拷貝構造函數:是一個特殊的構造函數,是使用一個已經存在的對象,去創建另外一個同類型的對象
類名(const 類名& 新參名)
class A{
public:
A(){ ...
}
A(const A& a){
}
};

3.2拷貝構造函數調用的時機
使用同類型的對象,去創建另外一個對象
A a;
A b=a;


把一個對象賦值給函數的形參
showa(A a)

把一個對象作爲函數的返回值
A geta(A a){
return a;
}

3.3什麼時候需要自定義拷貝構造函數
希望自定義拷貝過程,需要讓對象 有自己的獨立空間,默認的拷貝構造函數 是把原對象的數據進行逐字節的拷貝

 

【靜態成員函數】【靜態成員變量】
4.1 靜態成員函數是不需要對象就可以直接調用的成員函數
4.2 靜態受類名作用域和權限的控制
4.3 靜態成員函數只能訪問靜態成員,不能直接訪問非靜態成員
4.4 靜態成員變量必須在類外進行初始化,如果靜態成員是基本類型,則初始化爲0,如果是自定義類型,則自動調用無參構造
class A{
static int a;
};
靜態成員變量的類型  類名::變量名;

4.5 靜態成員函數無this指針,普通成員函數中,編譯器負責傳入一個指針this,而靜態函數不需要通過對象調用,也就沒有傳入this指針

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章