C 理解(4) C 的二階構造模式

2021-10-20 07:23:58 字數 2140 閱讀 9112

首先明白建構函式是什麼:

先丟擲問題:

建構函式執行結果是什麼?

建構函式中加上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...