建構函式、解構函式


在定義類別時,您可以使用建構函式(Constructor)來進行物件的初始化,而在物件釋放資源之前,您也可以使用「解構函式」 (Destructor)來進行一些善後的工作,例如清除動態配置的記憶體,或像是檔案的儲存、記錄檔的撰寫等等。

在C++中建構函式是與類別名稱相同的方法成員,且沒有傳回值,而解構函式則是在與類別名稱同的方法成員前加上~,不具有參數,也不具有傳回值,例如:
  • SafeArray.h
class SafeArray { 
public:
// 建構函式
SafeArray(int);
// 解構函式
~SafeArray();

int get(int);
void set(int, int);

int length;
private:
int *_array;

bool isSafe(int i);
};

在這個類別定義中,您定義了一個「安全陣列」類別,並定義有一個建構函式可以指定陣列長度,可依長度來動態產生陣列,而解構函式中則要負責清除動態產生的 陣列資源,以釋放動態配置時所配置的資源。在定義類別時如果沒有定義任何的建構函式,則會自動產生一個沒有參數、沒有實作內容的建構函式,以下是對 SafeArray定義的一個實現:
  • SafeArray.cpp
#include "SafeArray.h"

// 動態配置陣列
SafeArray::SafeArray(int len) {
length = len;
_array = new int[length];
}

// 測試是否超出陣列長度
bool SafeArray::isSafe(int i) {
if(i >= length || i < 0) {
return false;
}
else {
return true;
}
}

// 取得陣列元素值
int SafeArray::get(int i) {
if(isSafe(i)) {
return _array[i];
}

return 0;
}

// 設定陣列元素值
void SafeArray::set(int i, int value) {
if(isSafe(i)) {
_array[i] = value;
}
}

// 刪除動態配置的資源
SafeArray::~SafeArray() {
delete [] _array;
}
 0 1 2 3 4 5 6 7 8 9
下面的程式示範如何使用這個SafeArray類別:
  • main.cpp
#include <iostream> 
#include "SafeArray.h"
using namespace std;

int main() {
SafeArray safeArray(10);

for(int i = 0; i < safeArray.length; i++) {
safeArray.set(i, (i + 1) * 10);
}

for(int i = 0; i < safeArray.length; i++) {
cout << safeArray.get(i) << " ";
}
cout << endl;

return 0;
}

執行結果:

10 20 30 40 50 60 70 80 90 100

在建構函式的初始化設定語法中,您還可以使用成員初始化列表(Member initialization list),例如:
  • SafeArray.cpp
#include "SafeArray.h"

SafeArray::SafeArray(int len) : length(len) {
_array = new int[length];
}

...略

要被初始化的成員跟在參數列之後,要被設定給成員的引數被放在括號中,如果有多個成員要初始化,則以逗號分隔。

關於解構函式還有一個問題,如果沒有定義解構函式時,程式如何結束物件?答案是程式會自動建立一個沒有實作內容的解構函式並自動於適當的時機執行。