【C++深度剖析学习总结】 27 二阶构造模式

【C++深度剖析学习总结】 27 二阶构造模式

作者 CodeAllen ,转载请注明出处


1.构造函数的回顾
关于构造函数

  • 类的构造函数用于对象的初始化
  • 构造函数与类同名并且没有返回值
  • 构造函数在对象定义时自动被调用

2.问题

  • 1.如何判断构造函数的执行结果?没有办法
  • 2.在构造函数中执行return语句会发生什么?构造函数立即返回
  • 3.构造函数执行结束是否意味着对象构造成功?并不意味着构造成功

异常的构造函数

#include <stdio.h>

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;
}

3.构造函数

  • 只提供自动初始化成员变量的机会
  • 不能保证初始化逻辑一定成功
  • 执行return语句后构造函数立即结束

4.真相的意义
构造函数能决定的只是对象的初始状态,而不是对象的诞生!!

5.半成品对象
半成品对象的概念

  • 初始化操作不能按照预期完成而得到的对象
  • 半成品对象是合法的C++对象,也是Bug的重要来源
  • 难调的Bug:野指针、半成品对象
  • IntArray 半成品对象的危害

6.二阶构造—变成品对象的解决方案
核心:将构造过程一分为二

原理层面:
工程开发中的构造过程可分为

  • 资源无关的初始化操作
    • 不可能出现异常情况的操作
  • 需要使用系统资源的操作
    • 可能出现异常情况,如:内存申请,访问文件
      在这里插入图片描述

代码层面:
二阶构造示例一
在这里插入图片描述

二阶构造示例二
在这里插入图片描述

小结
构造函数只能决定对象的初始化状态
构造函数中初始化操作的失败不影响对象的诞生
初始化不完全的半成品对象是Bug的重要来源
二阶构造人为的将初始化过程分为两部分
二阶构造能够确保创建的对象都是完整初始化的

发布了315 篇原创文章 · 获赞 937 · 访问量 65万+

猜你喜欢

转载自blog.csdn.net/super828/article/details/105397008