您好,登錄后才能下訂單哦!
構(gòu)造函數(shù)存在的問題:
A、構(gòu)造函數(shù)只提供自動(dòng)初始化成員變量的機(jī)會(huì)
B、不能保證初始化邏輯一定成功,如申請(qǐng)系統(tǒng)資源可能失敗
C、執(zhí)行return語(yǔ)句后構(gòu)造函數(shù)立即結(jié)束
構(gòu)造函數(shù)創(chuàng)建的對(duì)象可能是半成品對(duì)象,半成品對(duì)象是合法的對(duì)象,但是程序bug的來(lái)源之一。因此實(shí)際工程開發(fā)過程中使用二階構(gòu)造模式。
由于構(gòu)造函數(shù)存在的潛在問題,實(shí)際工程開發(fā)中類對(duì)象的構(gòu)造過程如下:
A、資源無(wú)關(guān)的初始化操作
資源無(wú)關(guān)的初始化操作一般不會(huì)出現(xiàn)異常的情況
B、系統(tǒng)資源相關(guān)的操作
與系統(tǒng)資源有關(guān)的操作如堆空間申請(qǐng),文件訪問可能會(huì)失敗。
二階構(gòu)造模式的流程如下:
二階構(gòu)造模式能夠確保創(chuàng)建的對(duì)象都是完整初始化的。由于工程實(shí)踐中類對(duì)象占用的存儲(chǔ)空間比較大,一般需要分配在堆空間,因此二階構(gòu)造模式構(gòu)造對(duì)象的方式舍棄了構(gòu)造函數(shù)中將對(duì)象分配在棧和全局?jǐn)?shù)據(jù)區(qū)的情況,只保留創(chuàng)建在堆空間的對(duì)象的構(gòu)造。
二階構(gòu)造模式示例代碼:
#include <stdio.h>
class TwoPhaseCons
{
private:
TwoPhaseCons() // 第一階段構(gòu)造函數(shù)
{
}
bool construct() // 第二階段構(gòu)造函數(shù)
{
return true;
}
public:
static TwoPhaseCons* NewInstance(); // 對(duì)象創(chuàng)建函數(shù)
};
TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();
// 若第二階段構(gòu)造失敗,返回 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;
}
#include <iostream>
using namespace std;
class IntArray
{
private:
IntArray(int len)
{
m_length = len;
}
IntArray(const IntArray& obj);
bool construct()
{
bool ret = true;
m_pointer = new int[m_length];
if( m_pointer )
{
for(int i=0; i<m_length; i++)
{
m_pointer[i] = 0;
}
}
else
{
ret = false;
}
return ret;
}
public:
static IntArray* NewInstance(int length)
{
IntArray* ret = new IntArray(length);
//如果資源申請(qǐng)失敗
if( !(ret && ret->construct()) )
{
delete ret;
ret = 0;
}
return ret;
}
int length()
{
return m_length;
}
bool get(int index, int& value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
value = m_pointer[index];
}
return ret;
}
bool set(int index ,int value)
{
bool ret = (0 <= index) && (index < length());
if( ret )
{
m_pointer[index] = value;
}
return ret;
}
~IntArray()
{
delete [] m_pointer;
}
private:
int m_length;
int* m_pointer;
};
int main(int argc, char *argv[])
{
IntArray* array = IntArray::NewInstance(5);
cout << array->length() << endl;
return 0;
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。