C++ 二阶构造模式

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

  构造函数没有返回值,所以不能通过返回值来判断是构造函数是否构造成功。

  如果给构造函数强行加入一个返回值,用来表示是否构造成功。这样确实能够反映出构造的结果,但是不够优雅,有点呆。

2、在构造函数中执return 会发生什么?

  当构造函数中执行return后构造函数直接返回,后面的程序将不能被执行到。这样将产生一个“半成品对象”。

3、构造函数执行结束是否意味着对象构造成功?

  如果构造函数中具备申请内存的操作,那么申请内存的操作不可能百分之百成功,所以构造函数执行结束并不意味着构造成功。而声明的对象变成了“半成品对象”

综上所述:

  构造函数只能够提供一个自动初始化变量的机会,不能保证初始化逻辑一定成功,执行return语句后构造函数立即结束。(构造函数能够决定的只是对象的初始状态,而不是对象的诞生。)

关于“半成品对象”的概念:

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

  半成品对象是合法的C++对象。

二阶构造模式:

  所谓二阶构造模式,只是将构造分为两个阶段。

  一个阶段为资源无关的初始化操作(例如赋值等不需要访问到系统资源的相关操作。)

  第二阶段为与系统资源有关的操作(如申请内存,访问文件)。

   

二阶构造实验: 

 

#include <stdio.h>

class Test
{
    private:
        int *pData;
        int lenght;
        Test(int pDataLenght);//第一阶段构造函数
        bool construct()    ;//第二阶段构造函数        
    public:
        static Test* newInstance(int pDataLenght);//对象创建    
        bool steData(int pDataTab,int val);//设置参数
        bool getData(int pDataTab,int& pDataOut);//获取参数
        ~Test();
};

Test::Test(int pDataLenght)
{
    lenght = pDataLenght;
}

Test::~Test()
{
    delete[] pData;//释放堆空间内存。
    printf("this is Structure analysis function\n");//构析函数
    
}


bool Test::construct()
{
    bool ret = true;
    pData  = new int(lenght);
    if(pData)
    for(int i=0;i<lenght;i++)
        pData[i] = 0;
    else 
        {            
            ret = false;            
        }
    return ret;
}
Test* Test::newInstance(int pDataLenght)
{
    Test* ret = new Test(pDataLenght);//完成第一阶段构造
    if(!(ret && ret->construct()))
        {
            delete ret;
            ret = NULL;
        }
    return ret;
}


bool Test::steData(int pDataTab,int val)
{
    bool ret = true;
    if(pDataTab>=0 && pDataTab<lenght)
    {
        pData[pDataTab] = val;
    }
    else 
        ret = false;
    return ret;
    
}
bool Test::getData(int pDataTab,int& pDataOut)
{
    bool ret = true;
    if(pDataTab>=0 && pDataTab<lenght)
    {
        pDataOut = pData[pDataTab];
    }
    else 
        ret = false;
    return ret;    
}

int main(void)

{
    Test* obj = Test::newInstance(5);//使用二阶构造 只能使用静态函数进行创建
    obj->steData(0, 10);
    for(int i  = 0 ;i<5 ;i++)
        {
            int temp;
            if(obj->getData(i,temp))
                printf("%d = %d\n",i,temp);
        }
    delete obj;
    return 0;
}

运行结果:

0 = 10
1 = 0
2 = 0
3 = 0
4 = 0
this is Structure analysis function

猜你喜欢

转载自www.cnblogs.com/hjxzjp/p/11674960.html