C++中的二阶构造模式

依然范特西╮ 提交于 2020-02-06 01:58:56

1 C++中的二阶构造模式

1.1 半成品对象

首先回顾下构造函数:

  • 类的构造函数用于对象的初始化。
  • 构造函数与类同名并且没有返回值。
  • 构造函数在对象定义时自动被调用。

思考如下几个问题:

  1. 如何判断构造函数的执行结果?
  2. 在构造函数中执行return语句会发生什么?
  3. 构造函数执行结束是否意味着对象构造成功?

实际上的构造函数:

  • 只提供自动初始化成员变量的机会。
  • 不能保证初始化逻辑一定成功。
  • 执行return语句后构造函数立即结束。

构造函数只能决定对象的初始化状态,构造函数中初始化操作的失败不影响对象的诞生!

半成品对象的概念:

  • 初始化操作不能按照预期完成而得到的对象。
  • 半成品对象是合法的C++对象,也是Bug的重要来源。

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


参考资料:

  1. C++深度解析教程
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!