C 中建構函式之二階構造模式

2021-08-22 06:03:38 字數 1717 閱讀 3062

我們在前邊已經知道,建構函式是c++中的一種特殊的函式,其沒有返回值,在物件定義時自動被呼叫,主要用於物件中成員變數的初始化,但是有個問題是,我們前期一直都是預設建構函式能正常執行完畢,但是假如建構函式中執行出錯,或者提前返回,會有什麼情況發生?下邊來看一段**:

#include #include using namespace std;

class test

int getvalue1()

int getvalue2()

};int main()

編譯輸出:

從輸出我們看到,只有成員變數m_value1被初始化成功了,m_value2是隨機值,這是因為我們提前在建構函式中提前返回了,換個比方就是假如建構函式中初始化失敗,按目前的方式,也會正常返回,但是其實並沒有完成對成員變數的初始化。

為了解決建構函式中初始化不成功的問題,我下邊引出乙個概念:二階構造。大體思路是將構造分為兩部分,第一部分為與資源無關的(即不會出現異常),第二部分為可能會出錯的(例如訪問系統資源、外部檔案等等)。

為了實現上述的流程,我們需要上一章節介紹的靜態成員函式,**如下:

#include #include using namespace std;

class test

//第一階段,內部可實現一些與資源無關的操作

bool construct() //第二階段,所有可能發生異常的操作都可放在這裡執行

return true;

}public:

static test* newinstance()

return ret; //否則返回已經生成完成的物件指標

}int getvalue1()

int getvalue2()

};int main()

else

system("pause");

}

編譯輸出:

先在我們將第二階段的bool construct()函式改動一下,使其返回false,模擬訪問系統資源出錯,這就相當於物件構造失敗

bool construct()	//第二階段,所有可能發生異常的操作都可放在這裡執行

//return true;

}

將改後的**重新編譯輸出一下:

這時,我們就知道,建構函式中出錯了,就能很快的定位問題點,使用二階構造模式,使得我們能夠知道生成的物件是否完整。

總結:-建構函式只能決定物件的初始化狀態

-建構函式中初始化操作的失敗不影響物件的誕生

-初始化不完全的半成品物件是bug的重要**

-二階構造是人為的把初始化過程分為兩部分,確保建立的物件都是完整初始化的。

二階構造模式

我們在建立物件的時候,需要呼叫建構函式,對物件做初始化,但是建構函式是沒有返回值的,無法判斷建構函式的執行結果。如果建構函式執行過程中,發生了異常,導致函式提前返回了,那麼這種情況下,我們建立的物件會處於什麼狀態。1.建構函式確定對物件做初始狀態,物件的建立與建構函式無關,也就是說儲存物件的那片記憶...

二階構造模式

模式 方法。設計模式,就是設計方法。前人證明了的行之有效的方法。建構函式 1.關於建構函式 類的建構函式用於物件的初始化。建構函式與類同名並且沒有返回值。建構函式在物件定義時自動被呼叫。問題 1.如何判斷建構函式的執行結果?2.在建構函式中執行return語句會發生什麼?3.建構函式執行結束是否意味...

二階構造模式

建構函式只決定物件的初始化狀態,不可以決定物件是否建立。如果在建構函式中使用return,則將構造出乙個半成品物件。半成品物件 建構函式沒有全部執行。二階構造 分兩步來構造乙個物件。第一步 與系統資源無關的初始化操作。不會出現異常操作的 include class twophasecons bool...