物件指標


這個主題延續 建構函式、解構函式 的範例,主要在main()函式的不同,先列出這個部份的程式碼:
  • main.cpp
#include <iostream> 
#include "SafeArray.h"
using namespace std;

int main() {
SafeArray *safeArray = new 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;

delete safeArray;

return 0;
}

執行結果:
10 20 30 40 50 60 70 80 90 100

在這個程式中,您使用new來動態配置物件,new會傳回物件的記憶體空間位址,所以您必須使用「物件指標」來記錄這個位址,物件指標與變數的指標類似, 只要使用類別名稱加上*運算子即可宣告物件指標。

要使用物件指標存取物件成員時,並不是使用「.」運算子,而是使用「->」運算子,就如您在程式中所看到的。

由於您是使用new來配置物件,所以必須使用delete來清除物件所配置到的記憶體空間,當物件被清除時,會執行其解構函式。

類別其實就是您自行定義的資料型態,所以它也可以如同C++內建的資料型態一樣進行陣列的建立,例如:
SafeArray arrs[] = {SafeArray(5), SafeArray(10), SafeArray(15)};

由於陣列名稱擁有指標的運算特性,當您對物件指標加一或減一時,它會位移一個物件的記憶體單位,例如下面這個程式中,您使用物件指標來存取陣列元件內容:
  • main.cpp
#include <iostream> 
#include "SafeArray.h"
using namespace std;

int main() {
SafeArray arrs[] = {SafeArray(5), SafeArray(10), SafeArray(15)};

for(int i = 0; i < 3; i++) {
SafeArray *safeArray = arrs + i;
for(int j = 0; j < safeArray->length; j++) {
safeArray->set(j, (j + 1) * 10);
}
}

for(int i = 0; i < 3; i++) {
SafeArray *safeArray = arrs + i;
for(int j = 0; j < safeArray->length; j++) {
cout << safeArray->get(j) << " ";
}
cout << endl;
}

return 0;
}

執行結果:

10 20 30 40 50
10 20 30 40 50 60 70 80 90 100
10 20 30 40 50 60 70 80 90 100 110 120 130 140 150