1 C++中的二阶构造模式

1.1 半成品对象

首先回顾下构造函数:

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

思考如下几个问题:

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

实际上的构造函数:

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

构造函数只能决定对象的初始化状态,构造函数中初始化操作的失败不影响对象的诞生!

半成品对象的概念:

  • 初始化操作不能按照预期完成而得到的对象。
  • 半成品对象是合法的C++对象,也是Bug的重要来源。

1.2 二阶构造

工程开发中的构造过程可分为:

  • 资源无关的初始化操作,不可能出现异常情况的操作。
  • 需要使用系统资源的操作,可能出现异常情况,如:内存申请、访问文件。

二阶构造人为的将初始化过程分为两部分,二阶构造能够确保创建的对象都是完整初始化的。




示例代码:

#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\n", obj);delete obj;return 0;
}

参考资料:

  1. C++深度解析教程

C++中的二阶构造模式相关推荐

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

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

  2. sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...

    软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...

  3. java开发中Bean的Builder模式简析

    1.传统模式,通过构造器new出来 大量重载,添加属性,则需要添加新的构造方法,不利于拓展 public class Animal {private String eyes;private Strin ...

  4. Go语言中常见的并发模式

    Go语言最吸引人的地方是它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的通信顺序进程(Communicating Sequential Process,CSP).CS ...

  5. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...

  6. R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串、str_replace_all函数替换所有匹配到的

    R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串.str_replace_all函数替换所有匹配到的 ...

  7. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  8. 从脑电图(EEG)中提取稳定的模式进行识别

    本篇文章是论文<Identify Stable Patterns over Time for Emotion Recognition from EEG>(<从脑电图(EEG)中提取稳 ...

  9. .Net中的设计模式——Iterator模式

    在.Net中,我们很少有机会使用Iterator模式,因为.Net Framework已经运用Iterator模式为所有的集合对象实现了迭代器.我们在遍历集合对象时,喜欢使用C#提供的foreach语 ...

最新文章

  1. 上海python培训比较好的机构-上海Python培训机构推荐
  2. wxWidgets:窗口删除
  3. SAP BTP SDK for iOS 介绍
  4. JDK 8 新特性 之 方法引用
  5. 卵巢鸿蒙不全怎么检查,卵巢黄体功能不足怎么办 这三个处理方法要了解
  6. TensorFlow精进之路(四):CIFAR-10图像识别(上)
  7. R语言基础入门,看这里!
  8. 计算机培训中学语文研修计划,初中语文个人研修计划书
  9. 易班自动答题脚本_自动答题脚本教程及源码分享(无视分辨率)
  10. 阿里大淘系模型治理阶段性分享
  11. 利用Hilbert变换进行相位调制信号的解调
  12. ctrl+alt+方向键 与win7的旋转屏幕冲突解决
  13. svn 服务器创建文件夹,svn服务器创建文件夹
  14. python中如何将矩阵合并并多一个维度
  15. 基于SSH+MySQL+JSP的体育用品商城系统(附文档)
  16. 一个非常不错的JQ 插件库
  17. 新书推荐 | 数据流机器学习:MOA实例
  18. matplotlib简要画图
  19. 微信小程序云开发增加定时任务
  20. android立体3D效果_3D立体画,让你身临其境

热门文章

  1. 【Matlab 控制】利用 Matlab Function 绘制分段函数
  2. 【控制】《多无人机协同控制技术》周伟老师-第10章-多无人机协同目标跟踪飞行控制策略
  3. 【Matlab 图像】bwlabel() 连通域及图像分割
  4. 【步态识别】基于CNN、步态能量图+HOG特征提取的步态识别算法的MATLAB仿真
  5. 【机器学习基础】GBDT--梯度提升树实例分析完全解读
  6. Android Message解析
  7. CUBA在查询语句如何添加参数
  8. 【转】tcp链接的状态
  9. 数据库连接客户端使用(db2,oracle,mysql)
  10. Silverlight Telerik RadGridView动态增删行及行列操作(转载)