溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++語(yǔ)言學(xué)習(xí)(六)——二階構(gòu)造模式

發(fā)布時(shí)間:2020-07-16 10:04:21 來(lái)源:網(wǎng)絡(luò) 閱讀:5489 作者:天山老妖S 欄目:編程語(yǔ)言

C++語(yǔ)言學(xué)習(xí)(六)——二階構(gòu)造模式

一、構(gòu)造函數(shù)的問題

構(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)造模式

1、二階構(gòu)造模式簡(jiǎn)介

由于構(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)造模式的流程如下:
C++語(yǔ)言學(xué)習(xí)(六)——二階構(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)造。

2、二階構(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;
}

3、二階構(gòu)造函數(shù)應(yīng)用

#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;
}
向AI問一下細(xì)節(jié)

免責(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)容。

AI