`
#include
class
twophasecons
bool
construct()
// 第二階段建構函式
public
:static twophasecons*
newinstance()
;// 物件建立函式};
twophasecons* twophasecons::
newinstance()
return ret;
}int
main()
1.建構函式與半成品物件
2.二階構造
3.小結
1.建構函式與半成品物件
關於建構函式:
類的建構函式用於物件的初始化
建構函式與類同名並且沒有返回值
建構函式在物件定義時自動被呼叫
問題:如何判斷建構函式的執行結果?
在建構函式中執行return語句會發生什麼?
建構函式執行結束是否意味著物件構造成功?
(沒有辦法判斷建構函式的執行結果,建構函式執行結束不意味著物件構造成功)
用乙個狀態來表示物件是否構造成功:
#include
class test
int geti()
int getj()
int status()
int main()
return 0;}
輸出結果為空。
建構函式:
只提供自動初始化成員變數的機會
不能保證初始化邏輯一定成功
執行return語句後建構函式立即結束
建構函式能決定的只是物件的初始狀態,而不是物件的誕生!!
半成品物件的概念:
資源無關的初始化操作
不可能出現異常情況的操作
需要使用系統資源的操作
可能出現異常情況,如:記憶體申請,訪問檔案
二階構造:
二階構造示例一:
二階構造示例二:
示例**:
#include
class twophasecons
bool construct() // 第二階段建構函式
public:
static twophasecons* newinstance(); // 物件建立函式
};twophasecons* twophasecons::newinstance()
return ret;int main()
執行結果為:
[root@bogon desktop]# g++ test.cpp
[root@bogon desktop]# ./a.out
obj = 0xd4f010
若是二階構造失敗了呢?
#include
class twophasecons
bool construct() // 第二階段建構函式
public:
static twophasecons* newinstance(); // 物件建立函式
};twophasecons* twophasecons::newinstance()
return ret;int main()
執行結果為:
[root@bogon desktop]# g++ test.cpp
[root@bogon desktop]# ./a.out
obj = (nil)
會返回乙個空。
使用二階構造模式後,物件只能在堆空間上建立,不能在棧上產生了。這恰恰是工程裡面最重要的乙個決定,因為在工程中,物件往往是比較巨大的,不適合放在棧空間當中,都應該放到堆空間裡面去。
3.小結
建構函式只能決定物件的初始化狀態
建構函式中初始化操作的失敗不影響物件的誕生
初始化不完全的半成品物件是bug的重要**
二階構造人為的將初始化過程分為兩部分
二階構造能夠確保建立的物件都是完整初始化的
C 二階構造
1.如何判斷建構函式的執行結果?目前無法判斷 2.在建構函式中執行return語句會發生什麼?建構函式直接 返回,執行結束 3.建構函式執行結束是否意味著物件構造成功?不 include class test int geti int getj int status int main return ...
C 二階建構函式
一 建構函式的問題 建構函式存在問題 a 建構函式只提供自動初始化成員變數的機會 b 不能保證初始化邏輯一定成功,如申請系統資源可能失敗 c 執行return語句後建構函式立即結束 建構函式建立的物件可能是半成品物件,半成品物件是合法的物件,但是是程式bug的 之一。因此實際工程開發過程中使用二階構...
c 類建構函式 二階構造法
為什麼要用二階構造?當類的成員比較簡單,如只有賦值等簡單操作時,普通的建構函式就可以。然而實際中,以物件導向的思維開發程式時,類往往十分複雜,設計到動態記憶體申請 檔案開啟等操作。然而在呼叫建構函式後,無法得知這些複雜的操作是否順利完成。假若動態記憶體未成功申請,然而物件例項在主程式中依然成功建立,...