91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++語言學習(六)——二階構造模式

發布時間:2020-07-16 10:04:21 來源:網絡 閱讀:5490 作者:天山老妖S 欄目:編程語言

C++語言學習(六)——二階構造模式

一、構造函數的問題

構造函數存在的問題:
A、構造函數只提供自動初始化成員變量的機會
B、不能保證初始化邏輯一定成功,如申請系統資源可能失敗
C、執行return語句后構造函數立即結束
構造函數創建的對象可能是半成品對象,半成品對象是合法的對象,但是程序bug的來源之一。因此實際工程開發過程中使用二階構造模式。

二、二階構造模式

1、二階構造模式簡介

由于構造函數存在的潛在問題,實際工程開發中類對象的構造過程如下:
A、資源無關的初始化操作
資源無關的初始化操作一般不會出現異常的情況
B、系統資源相關的操作
與系統資源有關的操作如堆空間申請,文件訪問可能會失敗。
二階構造模式的流程如下:
C++語言學習(六)——二階構造模式
二階構造模式能夠確保創建的對象都是完整初始化的。由于工程實踐中類對象占用的存儲空間比較大,一般需要分配在堆空間,因此二階構造模式構造對象的方式舍棄了構造函數中將對象分配在棧和全局數據區的情況,只保留創建在堆空間的對象的構造。

2、二階構造模式示例

二階構造模式示例代碼:

#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;
}

3、二階構造函數應用

#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);
        //如果資源申請失敗
        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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

拉萨市| 安新县| 清徐县| 昭苏县| 泽普县| 会泽县| 临颍县| 岫岩| 临洮县| 三原县| 烟台市| 长治市| 包头市| 滦平县| 明溪县| 浮梁县| 灌阳县| 通州区| 朔州市| 南漳县| 错那县| 孝昌县| 汉川市| 太仆寺旗| 赞皇县| 旅游| 呈贡县| 商水县| 连城县| 庆元县| 托克逊县| 儋州市| 广丰县| 新宾| 株洲县| 乌审旗| 贵州省| 长海县| 封丘县| 屏东县| 二连浩特市|