1. 程式人生 > >C++構造函數與析構函數

C++構造函數與析構函數

bsp 參數 類定義 www .html span 情況下 定義 ron

一 構造函數與析構函數的執行順序    

c++中對象都是先構造成員變量,再調用自身的構造函數;故父類成員變量首先被構造,然後調用父類的構造函數,再構造子類的成員變量,最後調用子類的構造函數。

對象析構時與構造順序相反,子類先調用自身的析構函數,再調用子類成員變量的析構函數,再調用父類的析構函數,再析構父類的成員變量。

二 子類的構造函數寫法

1)

構造方法用來初始化類的對象,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變量和成員方法,但不繼承父類的構造方法)。因此,在創建子類對象時,為了初始化從父類繼承來的數據成員,系統需要調用其父類的構造方法。

如果沒有顯式的構造函數,編譯器會給一個默認的構造函數,並且該默認的構造函數僅僅在沒有顯式地聲明構造函數情況下創建。

構造原則如下:

1. 如果子類沒有定義構造方法,則調用父類的無參數的構造方法。

2. 如果子類定義了構造方法,不論是無參數還是帶參數,在創建子類的對象的時候,首先執行父類無參數的構造方法,然後執行自己的構造方法。

3. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數,則會調用父類的默認無參構造函數。

4. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類自己提供了無參構造函數,則會調用父類自己的無參構造函數。

5. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類只定義了自己的有參構造函數,則會出錯(如果父類只有有參數的構造方法,則子類必須顯示調用此帶參構造方法)。

2)子類調用父類帶參數構造函數的方法

class Camera {
public:
    explicit Camera(camera_set *set);
};
class MyCamera: public Camera {
public:
    MyCamera(camera_set *set) :
            Camera(set) {

    }
};

三 對象初始化的兩種方式

對象調用構造函數有兩種方式,如下

Camera camera(&set);
Camera *camera=new Camera(&set);

參考引用:

C++中成員變量 父類 子類構造析構順序

C++繼承中關於子類構造函數的寫法

C++構造函數與析構函數