zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Dockerfile + Nginx.conf文件记录(用于前端项目部署)
    Dockerfile文件记录(用于后端项目部署)
    结合docker发布后端项目(基于gradle包管理)的shell脚本
    结合docker发布前端项目(基于npm包管理)的shell脚本
    Docker+Nginx使用流程(笔记)
    AntDesign getFieldDecorator 获取自定义组件的值
    c++ primer 第五版第七章
    c++ primer 第五版第六章
    c++ primer 第五版第五章
    c++ Primer 第五版习题答案第四章
  • 原文地址:https://www.cnblogs.com/judes/p/7967854.html
Copyright © 2011-2022 走看看