C++ 解析 - 建構元與解構元

C++ 解析 主目錄
建構元與解構元
虛擬函數
函數

建構元與解構元
大部份的類別在設計時都會包含有一個或多個建構元(constructor), 一個解構元(destructor)以及一個複製指派元(copy assignment operator).

建構元的用處是當一個物件被 new 建置起來之後用來初始化該一物件之用. 建構元可以有數個, 同一類別之多個建構元各包含了不同數量與型別之參數. 而沒有參數或其所有參數均具有預設值之建構元則稱為預設建構元 (default constructor). 如果在設計類別時沒有在程式碼中定義任何建構元, 則編譯器會為這個類別自動產生一個隱含的預設建構元.


隱含的函數
我們先來看一下一個簡單的類別設計:

class ubClass{};
實際經過編譯之後, 以上的程式碼會變成如下:

class ubClass
{
public:
   ubClass() {}                          //預設建構元
   ubClass(const Empty&) {}              //複製建構元
   ~ubClass() {}                         //解構元
   ubClass& operator=(const ubClass&) {} //複製指派元
}

接下來看看這幾個函數什麼時候會被呼叫:

ubClass ubA;      //預設建構元
~ubClass()        //解構元
ubClass ubB(ubA); //複製建構元
ubB = ubA;        //複製指派元



預設建構元
建構元的用處是當一個物件被 new 建置起來之後用來初始化該一物件之用. 建構元可以有數個, 同一類別之多個建構元各包含了不同數量與型別之參數. 預設建構元則是被定義為一個呼叫時不需傳入參數之建構.

class ubClass
{
   int n;
public:
   ubClasss();  //預設建構元在此宣告
}

此一建構元可以沒有參數或其所有參數均為具有預設值之設定. 如果撰寫程式時沒有設定預設建構元則 C++ 的編譯器會自動產生一個隱含的預設建構元.

預設建構元會在以下的狀況發生時被執行:
  • 當一個物件的值被宣告時沒有加上參數列, 如: ubClass X; 或動態生成時 沒有加上參數列, 如: new ubClass; 此時,  預設建構元會被用來初始化該物件.
  • 當一個物件矩陣被宣告時 , 如: ubClass X[5];  或動態生成時, 如: new ubClass[10];  此時,  預設建構元會被用來初始化所有矩陣內之物件.

預設建構元的注意要項:
  • 如果自行定義了任何建構元時,則也一定要順便定義預設建構元。
  • 定義了預設建構元之後,在具現物件時如果沒有指定初始值,則會用預設建構元來初始化該物件。



解構元

解構元是由編譯程式自動呼叫,所以解構元不能有傳回值,同時也不能有參數或是被覆載。

若主程式是用像 abort() 之類的程式中斷函數結束執行的話,那所有的解構 元都不會執行,
控制權會立刻交還給系統。



C++ 解析 主目錄
建構元與解構元
虛擬函數
函數

沒有留言:

張貼留言