C 二階構造的實現

2021-10-02 10:08:34 字數 2033 閱讀 6519

`

#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 類建構函式 二階構造法

為什麼要用二階構造?當類的成員比較簡單,如只有賦值等簡單操作時,普通的建構函式就可以。然而實際中,以物件導向的思維開發程式時,類往往十分複雜,設計到動態記憶體申請 檔案開啟等操作。然而在呼叫建構函式後,無法得知這些複雜的操作是否順利完成。假若動態記憶體未成功申請,然而物件例項在主程式中依然成功建立,...