1. 程式人生 > >C++二階構造函數

C++二階構造函數

return 空間 c++ ref 流程 key ret cti ble

轉自:http://blog.51cto.com/9291927/1896411

一、構造函數的問題

構造函數存在問題:

A、構造函數只提供自動初始化成員變量的機會

B、不能保證初始化邏輯一定成功,如申請系統資源可能失敗

C、執行return語句後構造函數立即結束

構造函數創建的對象可能是半成品對象,半成品對象是合法的對象,但是是程序bug的來源之一。因此實際工程開發過程中使用二階構造模式。

二、二階構造模式

由於構造函數存在的潛在問題,實際工程開發中類對象的構造過程如下:

A、資源無關的初始化操作

資源無關的初始化操作一般不會出現異常的情況

B、系統資源相關的操作

與系統資源有關的操作如堆空間申請,文件訪問可能會失敗。

二階構造模式的流程如下:

技術分享圖片

二階構造模式能夠確保創建的對象都是完整初始化的。由於工程實踐中類對象占用的存儲空間比較大,一般需要分配在堆空間,因此二階構造模式構造對象的方式舍棄了構造函數中將對象分配在棧和全局數據區的情況,只保留創建在堆空間的對象的構造。

二階構造模式實例代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include <stdio.h>
class TwoPhaseCons { private: TwoPhaseCons() // 第一階段構造函數 { } bool construct() // 第二階段構造函數 { return true; } public: static TwoPhaseCons* NewInstance(); // 對象創建函數 }; TwoPhaseCons* TwoPhaseCons::NewInstance() { TwoPhaseCons* ret = new TwoPhaseCons();
// 若第二階段構造失敗,返回 NULL if( !(ret && ret->construct()) ) { delete ret; ret = NULL; } return ret; } int main() { TwoPhaseCons* obj = TwoPhaseCons::NewInstance(); printf("obj = %p\n", obj); delete obj; return 0; }

C++二階構造函數