C++筆記 第十七課 物件的構造(上)---狄泰學院
阿新 • • 發佈:2018-11-06
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第十七課 物件的構造(上)
問題:物件中成員變數的初始值是多少?不定的
小實驗
下面的類定義中成員變數i和j的初始值為什麼?
17-1 成員變數的初始值
#include <stdio.h> class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } }; Test gt; int main() { printf("gt.i = %d\n", gt.getI()); printf("gt.j = %d\n", gt.getJ()); Test t1; printf("t1.i = %d\n", t1.getI()); printf("t1.j = %d\n", t1.getJ()); Test* pt = new Test; printf("pt->i = %d\n", pt->getI()); printf("pt->j = %d\n", pt->getJ()); delete pt; return 0; } 執行結果 gt.i = 0 gt.j = 0 t1.i = 4196368 t1.j = 0 pt->i = 0 pt->j = 0
1.物件的初始化
從程式設計的角度,物件只是變數,因此:
在棧上建立物件時,成員變數初始為隨機值
在堆上建立物件時,成員變數初始為隨機值
在靜態儲存區建立物件時,成員變數初始為0值
生活中的物件都是在初始化後上市的
初始狀態(出廠設定)是物件普遍存在的一個狀態
問題:程式中如何對一個物件進行初始化?
一般而言,物件都需要一個確定的初始狀態
解決方案
在類中提供一個public的initialize函式
物件建立後立即呼叫initialize函式進行初始化
17-2 初始化函式
#include <stdio.h> class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } void initialize() { i = 1; j = 2; } }; Test gt; int main() { gt.initialize(); printf("gt.i = %d\n", gt.getI()); printf("gt.j = %d\n", gt.getJ()); Test t1; //t1.initialize(); //初始化應該立即呼叫,如果沒有,則容易出錯 printf("t1.i = %d\n", t1.getI()); printf("t1.j = %d\n", t1.getJ()); t1.initialize(); //呼叫時間不適合 Test* pt = new Test; pt->initialize(); printf("pt->i = %d\n", pt->getI()); printf("pt->j = %d\n", pt->getJ()); delete pt; return 0; } 執行結果 gt.i = 1 gt.j = 2 t1.i = 1 t1.j = 2 pt->i = 1 pt->j = 2
存在的問題
initialize只是一個普通函式,必須顯示呼叫
如果未呼叫initialize函式,執行結果是不確定的
2.建構函式—可以自動被呼叫
C++中可以定義與類名相同的特殊成員函式
這種特殊的成員函式叫做建構函式
構造沒有任何返回型別的宣告
建構函式在物件定義時自動被呼叫
17-3 建構函式初探
#include <stdio.h> class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } Test() { printf("Test() Begin\n"); i = 1; j = 2; printf("Test() End\n"); } }; Test gt; int main() { printf("gt.i = %d\n", gt.getI()); printf("gt.j = %d\n", gt.getJ()); Test t1; printf("t1.i = %d\n", t1.getI()); printf("t1.j = %d\n", t1.getJ()); Test* pt = new Test; printf("pt->i = %d\n", pt->getI()); printf("pt->j = %d\n", pt->getJ()); delete pt; return 0; } 執行結果 Test() Begin Test() End gt.i = 1 gt.j = 2 Test() Begin Test() End t1.i = 1 t1.j = 2 Test() Begin Test() End pt->i = 1 pt->j = 2
小結
每個物件在使用之前都應該初始化
類的建構函式用於物件的初始化
建構函式與類同名並且沒有返回值
建構函式在物件定義時自動被呼叫