【C++】27 二阶构造模式 Test() : mStatus() IntArray.cpp

二阶构造模式

构造函数

类的构造函数用于对象的初始化

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

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

【C++】27 二阶构造模式 Test() : mStatus() IntArray.cpp_第1张图片
例:

#include 

class Test
{
    int mi;
    int mj;
    bool mStatus;
public:
    Test(int i, int j) : mStatus(false)
    {
        mi = i;
        
        return;
        
        mj = j;
        
        mStatus = true;
    }
    int getI()
    {
        return mi;
    }
    int getJ()
    {
        return mj;
    }
    int status()
    {
        return mStatus;
    }
};

int main()
{  
    Test t1(1, 2);
    
    if( t1.status() )
    {
        printf("t1.mi = %d\n", t1.getI());
        printf("t1.mj = %d\n", t1.getJ());
    
    }
    
    return 0;
}

构造函数:

只提供自动初始化成员变量的机会

不能保证初始化逻一定成功

执行return依据后构造函数立即结束

半成品对象的概念

初始化操作不能按照预期完成而得到的对象

半成品对象是合法C++对象,bug的重要来源

工程开发中构造过程可分为

资源无关的初始化操作

不可能出现异常情况的操作

需要使用系统资源的操作

可能出现异常情况,如:内存申请,访问文件

【C++】27 二阶构造模式 Test() : mStatus() IntArray.cpp_第2张图片
例:

#include "stdio.h"

class TwoPhaseCons
{
    private:
    TwoPhaseCons()    //创建一阶构造函数
    {}
    bool construct()  //第二阶段构造函数  
    {
        return false;
    }  
    public:
    static TwoPhaseCons* NewInstance();  //对象构造函数
};
TwoPhaseCons* TwoPhaseCons :: NewInstance()
{
    TwoPhaseCons* ret = new TwoPhaseCons();
    if(!(ret && ret ->construct()))
    {
        delete ret;
        ret = NULL;
    }
    return ret;
}
int main()
{
    TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
    printf("obj = %p\n",obj);
    return 0;
 }

输出结果:

obj = (nil)

小结:

构造函数只能决定对象的初始化状态

构造函数中初始化操作的失败不影响对象的诞生

初始化不完全的半成品对象是bug的重要来源

二阶构造人为的将初始化分为两部分

二阶构造能够确保创建的对象都是完整初始化

你可能感兴趣的:(c++)