【C++深度剖析教程4】C++的二阶构造模式

今天学习的是C++中的二阶构造模式,二阶构造模式只是设计模式中的简单的模式,是一种软件设计的方法,并没有我们想象的那么高深,设计模式也是一样,只不过是一系列的设计方法,只要我们懂得了原理,那么一切都是相通的。

回顾:构造函数的回顾

关于构造函数:

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

问题:

1.如何判断构造函数的执行结果br> 2.在构造函数中执行return语句会发生什么br> 3.构造函数执行结束是否意味着对象构造成功/p>

下面我们以码实例来分析问题:

这就是一个普普通通的代码,用来初始化两个变量的。编译输出结果为:

现在我在构造函数中加一个return语句如下:

执行结果为:

很显然mj变成了一个随机数,那么说明构造函数在构造对象t1时,执行到return语句后就返回了,并没有继续执行,那么到底是不是这样的呢们来做一个试验就知道了,添加一个bool型变量来判断构造函数执行到哪里去了,代码如下:

编译执行后,没有输出结果,说明构造函数没有将对象初始化完成。
由此我们可以得出几条结论:

构造函数:

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

从而我们知道,构造函数能决定的只是对象的初始状态,而不是对象的诞生!!!,上面的代码我们加了return语句后,t1这个对象就没有真正的被完全构造,所以不能正常使用这个对象。

这样的对象,我们叫它:半成品对象.

半成品对象的概念:

  • 初始化操作不能按照预期完成二得到的对象

  • 一般企业中最难以调试的Bug,一是野指针(后面文章会写),其次就是这个半成品对象带来的Bug。

二阶构造

那么我们该如何避免这样的Bug呢面就引出二阶构造的含义:

  • 工程开发中的构造过程可分为
    • 资源无关的初始化操作
      *不可能出现异常情况的操作
    • 需要使用系统资源的操作
      *可能出现异常情况,如:内存申请,访问文件

二阶构造大体流程:

我们来分析一下以上代码:
二阶构造示例:

第一阶段构造函数与第二阶段构造函数放到private里面了,外部无法调用。
但是在public中,定义的是static 型的NewInstance函数,返回TwoPhaseCons类型的对象,那么通过它就可以调用private里面的构造函数。例如在NewInstance函数里可以有如下代码: ,因为处于NewInstance内部,所以它可以调用构造函数。

TwoPhaseCons* TwoPhaseCons::NewInstance() {    TwoPhaseCons* ret = new TwoPhaseCons();    // 若第二阶段构造失败,返回 NULL        if( !(ret && ret->construct()) )     {delete ret;ret = NULL;    

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2017年11月12日
下一篇 2017年11月12日

相关推荐