二阶构造函数

为什么要是用二阶构造函数,要明白这个问题,那么我们需要先了解构造函数的几个特性:

1. 类的构造函数用于类的初始化

2. 构造函数与类同名并且没有返回值

3. 构造函数在对象定义时自动调用

好知道了这几个问题之后,那么问题来了

1. 如何判断构造函数的执行结果

2. 在构造函数里执行return语句会发生什么?

3. 构造函数结束之后,是否意味着对象的构造成功

构造函数只提供初始化成员变量的机会,不能保证初始化一定成功,执行return语句之后立刻返回,所以如果对象初始化不成功我们可能得到一个半成品对象,但是半成品对象在C++中是一个合法的对象这在程序中是一个比较棘手的BUG,所以构造函数只是对象的初始状态,而不是对象的诞生!!!!


对于这种情况带来的问题,提出了二阶构造的模式;

所谓二阶构造 就是将对象的构造分为两个部分,

第一部分:与资源无关的初始化,如对象中初始值的设置

第二部分:与资源有关的初始化,如内存资源的申请,文件的访问



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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值