我們在前邊已經知道,建構函式是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...