C/C++知识点之C++语言学习(六)——二阶构造模式
小标 2019-04-22 来源 : 阅读 1228 评论 0

摘要:本文主要向大家介绍了C/C++知识点之C++语言学习(六)——二阶构造模式,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之C++语言学习(六)——二阶构造模式,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。


一、构造函数的问题


构造函数存在的问题:
A、构造函数只提供自动初始化成员变量的机会
B、不能保证初始化逻辑一定成功,如申请系统资源可能失败
C、执行return语句后构造函数立即结束
构造函数创建的对象可能是半成品对象,半成品对象是合法的对象,但是程序bug的来源之一。因此实际工程开发过程中使用二阶构造模式。


二、二阶构造模式


1、二阶构造模式简介


由于构造函数存在的潜在问题,实际工程开发中类对象的构造过程如下:
A、资源无关的初始化操作
资源无关的初始化操作一般不会出现异常的情况
B、系统资源相关的操作
与系统资源有关的操作如堆空间申请,文件访问可能会失败。
二阶构造模式的流程如下:

二阶构造模式能够确保创建的对象都是完整初始化的。由于工程实践中类对象占用的存储空间比较大,一般需要分配在堆空间,因此二阶构造模式构造对象的方式舍弃了构造函数中将对象分配在栈和全局数据区的情况,只保留创建在堆空间的对象的构造。


2、二阶构造模式示例


二阶构造模式示例代码:


#include

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

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

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程