首先明白建構函式是什麼:
先丟擲問題:建構函式執行結果是什麼?
建構函式中加上return會發生什麼?
建構函式的執行結束是否意味著物件構造成功?
先上**:
#include
class
test
intgeti()
intgetj()
};intmain()
上述的**為簡單的c++**。結果是
t1.mi =
1t1.mj =
2
對於上述的問題,我們要加乙個return語句會發生什麼?
#include
class
test
intgeti()
intgetj()
};intmain()
結果:
t1.mi =
1t1.mj =
2527220
mj的結果不是2.表明建構函式執行在return這個函式就結束了。
因此建構函式只能決定物件的初始狀態,而不是決定物件的誕生。
在加return之後,t1這個物件並沒有完全構造,所以是不可以正常使用的。因此他叫半成品物件。
半成品物件的概念:初始化操作不能按照預期完成二得到的物件
半成品物件是合法的c++物件,但是同時它也是bug的重要**
一般企業中最難以除錯的bug,一是野指標(後面文章會寫),其次就是這個半成品物件帶來的bug。 為了避免這樣的結果,我們要引出二階構造的含義。工程開發中的構造過程可分為
資源無關的初始化操作(即不可能出現異常情況的操作)肯定不會出錯的情況他的大致流程如下:需要使用系統資源的操作(即可能出現異常情況,如:記憶體申請,訪問檔案)懷疑出錯的
先看一下**:
#include
class
twophasecons
bool
construct()
// 第二階段建構函式
public
:static twophasecons*
newinstance()
;// 物件建立函式};
twophasecons* twophasecons::
newinstance()
return ret;
}int
main()
第一階段的建構函式與第二階段的建構函式放在private裡面,外部無法呼叫
但是在public中,定義的static twophasecons* newinstance(); 返回的是twophasecons型的物件.那麼通過可以呼叫建構函式的private。因為處於newinstance內部,所以它可以呼叫建構函式。
twophasecons* ret =
newtwophasecons()
;
在main函式中有一句話:twophasecons* obj = twophasecons::newinstance();這是呼叫newinstance()函式建立obj 物件,因為建構函式twophasecons為private型別,所以想建立物件,必須用public中的靜態建立函式:static twophasecons* newinstance();
**
總結:建構函式只能決定物件的初始化狀態
建構函式中初始化操作的失敗不影響物件的誕生
初始化不完全的半成品物件是bug的主要**
二階構造人為的將初始化過程分成兩部分 二階構造能夠確保建立的物件都是完整初始化的
二階構造模式
我們在建立物件的時候,需要呼叫建構函式,對物件做初始化,但是建構函式是沒有返回值的,無法判斷建構函式的執行結果。如果建構函式執行過程中,發生了異常,導致函式提前返回了,那麼這種情況下,我們建立的物件會處於什麼狀態。1.建構函式確定對物件做初始狀態,物件的建立與建構函式無關,也就是說儲存物件的那片記憶...
二階構造模式
模式 方法。設計模式,就是設計方法。前人證明了的行之有效的方法。建構函式 1.關於建構函式 類的建構函式用於物件的初始化。建構函式與類同名並且沒有返回值。建構函式在物件定義時自動被呼叫。問題 1.如何判斷建構函式的執行結果?2.在建構函式中執行return語句會發生什麼?3.建構函式執行結束是否意味...
二階構造模式
建構函式只決定物件的初始化狀態,不可以決定物件是否建立。如果在建構函式中使用return,則將構造出乙個半成品物件。半成品物件 建構函式沒有全部執行。二階構造 分兩步來構造乙個物件。第一步 與系統資源無關的初始化操作。不會出現異常操作的 include class twophasecons bool...