本文內容取自於對狄泰學院 唐佐林老師 c++深度解析 課程的學習總結
關於建構函式如判斷
建構函式 的執行結果?
在建構函式中執行 return 語句會發生什麼?
建構函式執行 結束是否意味著 物件構造成功?
為什麼了回答這幾個問題,我們編寫乙個建構函式,並且建構函式中新增return 語句
#include
class
test
;test::
test
(int i,
int j)
:m_i(0
),m_j(0)
int test::
geti()
int test::
getj()
intmain
(void
)
執行結果
程式第27行給建構函式使用 return 強制返回,結果是 構造 t1 物件時,t1的m_j成員變數並沒有成功賦值為2,依然為初始化時的0。 m_i 成功賦值。實驗結論所以 t1 物件並沒有完全構造成功,而是乙個半成品物件 。
建構函式
建構函式能決定的 只是物件的初始狀態
而不是物件的誕生!!!
半成品物件 的概念
為了說明半成品物件的危害,我們來做個實驗array.h首先實現乙個陣列類,實驗構造陣列長度,設定陣列元素值,獲取資料元素值,獲取陣列長度功能。
#ifndef __array_h__
#define __array_h__
class
array
;#endif
array.cpp
#include
"array.h"
array::
array
(int len)
bool array::
setarrayval
(int index,
int val)
bool array::
getarrayval
(int index,
int& val)
int array::
getarraylen()
main.cpp
#include
"array.h"
#include
intmain
(void
)for
(int i=
0; i
getarraylen()
; i++
)return0;
}
執行結果:
實驗結果:成功的實現了我們預期的結果,構造了乙個長度為5的陣列物件,並對該物件元素進行賦值。現在,我們來人為製造半成品物件,假設構造物件時建構函式中 申請陣列堆記憶體失敗,會發生什麼情況
執行結果
實驗結論:由於堆記憶體申請失敗,設定陣列元素值時操作空指標導致程式段錯誤因為建構函式沒有返回值,我們無法獲知堆記憶體申請的結果,為了避免這種情況
我們增加了二階構造模式
工程開發中的 構造過程 可分為
1.資源無關 的初始化操作
不可能出現異常情況 的操作
2. 需要使用系統資源 的操作
可能出現異常情況,如:記憶體申請,訪問檔案等
二階構造過程
二階構造示例
物件建立函式示例
下面,我們將剛才的**做二階構造改寫
1.在array.h中增加二階構造介面
在array.cpp中實現二階構造介面
在main.cpp中呼叫物件建立函式進行物件的建立
執行結果
利用二階構造模式 可以對物件建立結果進行判斷,避免生成半成品物件而導致程式異常的發生
第27課 二階構造模式
1 類的建構函式用於物件的初始化 2 建構函式與類同名並且沒有返回值 3 建構函式在物件定義時自動被呼叫 1 如何判斷建構函式的執行結果?在類中新增乙個標誌 bool 放在建構函式的末尾 判斷函式體是否全部執行 通過功能成員函式判斷標誌狀態。這種方式能夠完成功能,但是設計不夠優美,需要手工進行判斷,...
27 二階構造模式
範例 異常的建構函式 include class test int geti int getj int status int main int argc,const char argv return 0 工程開發中的構造過程可分為 二階構造示例 class twophasecons bool con...
27 二階構造模式
關於建構函式 用於物件的初始化,與類同名並且沒有返回去,物件被定義時自動呼叫。1 如何判斷建構函式的執行結果?沒有辦法,2 建構函式中執行return語句會發生什麼?可以存在return語句,遇到return會立即返回,後邊的語句不會執行。3 建構函式執行結束是否意味著物件構造成功?不完美的解決方法...