zoukankan      html  css  js  c++  java
  • 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
    ");//构析函数
        
    }
    
    
    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
    ",i,temp);
            }
        delete obj;
        return 0;
    }

    运行结果:

    0 = 10
    1 = 0
    2 = 0
    3 = 0
    4 = 0
    this is Structure analysis function
  • 相关阅读:
    Enterprise Library 4.1 Data Access Block 快速使用图文笔记
    敏捷开发(名字起得很帅,很忽悠人)原则 括号里面加了自己的理解笔记
    与弟弟谈话的摘要
    练习:选头像控件
    [转]保护你的flash(as3)程序基于socket方式传送swf文件
    Silverlight 又多了一套skin
    Silverlight制作逐帧动画
    Silverlight Spy 2 源代码查看器
    跨平台开发silverlight
    Silverlight 2 搜索照片 Live
  • 原文地址:https://www.cnblogs.com/hjxzjp/p/11674960.html
Copyright © 2011-2022 走看看