• C++二阶构造函数


    转自:http://blog.51cto.com/9291927/1896411

     

    一、构造函数的问题

        构造函数存在问题:

        A、构造函数只提供自动初始化成员变量的机会

        B、不能保证初始化逻辑一定成功,如申请系统资源可能失败

        C、执行return语句后构造函数立即结束

        构造函数创建的对象可能是半成品对象,半成品对象是合法的对象,但是是程序bug的来源之一。因此实际工程开发过程中使用二阶构造模式。

    二、二阶构造模式

        由于构造函数存在的潜在问题,实际工程开发中类对象的构造过程如下:

    A、资源无关的初始化操作

    资源无关的初始化操作一般不会出现异常的情况

    B、系统资源相关的操作

    与系统资源有关的操作如堆空间申请,文件访问可能会失败。

    二阶构造模式的流程如下:

    wKiom1icIgKSSZgwAADHo0SCFn4616.png

        二阶构造模式能够确保创建的对象都是完整初始化的。由于工程实践中类对象占用的存储空间比较大,一般需要分配在堆空间,因此二阶构造模式构造对象的方式舍弃了构造函数中将对象分配在栈和全局数据区的情况,只保留创建在堆空间的对象的构造。

    二阶构造模式实例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #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 ", obj);
      
        delete obj;
         
        return 0;
    }
  • 相关阅读:
    golang删除数组某个元素
    golang用通道实现信号量,控制并发个数
    什么是ScaleIO中的forwards rebuild和backwards rebuild?
    SQL Server中的database checkpoint
    如何将thick provision lazy zeroed的VMDK文件转换为thick provision eager zeroed?
    LoadTestAgentResultsLateException in VS2010
    SQL Server Instance无法启动了, 因为TempDB所在的分区没有了, 怎么办?
    VMware vCenter中, 如何辩认虚机上Raw Device Mapping过了的一块物理磁盘?
    SQL Server AlwaysOn Setup Step-By-Step Guide
    TPC-E在populate测试Database时需要注意的一些事项
  • 原文地址:https://www.cnblogs.com/judes/p/7967854.html
Copyright © 2020-2023  润新知