C++中的二阶构造模式
1 C++中的二阶构造模式
1.1 半成品对象
首先回顾下构造函数:
- 类的构造函数用于对象的初始化。
- 构造函数与类同名并且没有返回值。
- 构造函数在对象定义时自动被调用。
思考如下几个问题:
- 如何判断构造函数的执行结果?
- 在构造函数中执行return语句会发生什么?
- 构造函数执行结束是否意味着对象构造成功?
实际上的构造函数:
- 只提供自动初始化成员变量的机会。
- 不能保证初始化逻辑一定成功。
- 执行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;
}
参考资料:
- C++深度解析教程
C++中的二阶构造模式相关推荐
- 【C++深度剖析教程4】C++的二阶构造模式
今天学习的是C++中的二阶构造模式,二阶构造模式只是设计模式中的简单的模式,是一种软件设计的方法,并没有我们想象的那么高深,设计模式也是一样,只不过是一系列的设计方法,只要我们懂得了原理,那么一切都是 ...
- sql中如何统计各种零件的总数量_如何应用GOF设计模式中的构建者模式创建复合对象实例...
软件项目实训及课程设计指导--如何应用GOF设计模式中的构建者模式创建复合对象实例 1.GOF设计模式中的构建者模式 构建者设计模式能够将一个复杂对象(它一般为组合类)的构建过程与它的表示部件相互分离 ...
- java开发中Bean的Builder模式简析
1.传统模式,通过构造器new出来 大量重载,添加属性,则需要添加新的构造方法,不利于拓展 public class Animal {private String eyes;private Strin ...
- Go语言中常见的并发模式
Go语言最吸引人的地方是它内建的并发支持.Go语言并发体系的理论是C.A.R Hoare在1978年提出的通信顺序进程(Communicating Sequential Process,CSP).CS ...
- Java中的简单工厂模式(转)
Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...
- R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串、str_replace_all函数替换所有匹配到的
R语言使用str_replace函数和str_replace_all函数替换字符串中匹配到的模式:str_replace函数替换第一个匹配到的字符串.str_replace_all函数替换所有匹配到的 ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...
- 从脑电图(EEG)中提取稳定的模式进行识别
本篇文章是论文<Identify Stable Patterns over Time for Emotion Recognition from EEG>(<从脑电图(EEG)中提取稳 ...
- .Net中的设计模式——Iterator模式
在.Net中,我们很少有机会使用Iterator模式,因为.Net Framework已经运用Iterator模式为所有的集合对象实现了迭代器.我们在遍历集合对象时,喜欢使用C#提供的foreach语 ...
最新文章
- 上海python培训比较好的机构-上海Python培训机构推荐
- wxWidgets:窗口删除
- SAP BTP SDK for iOS 介绍
- JDK 8 新特性 之 方法引用
- 卵巢鸿蒙不全怎么检查,卵巢黄体功能不足怎么办 这三个处理方法要了解
- TensorFlow精进之路(四):CIFAR-10图像识别(上)
- R语言基础入门,看这里!
- 计算机培训中学语文研修计划,初中语文个人研修计划书
- 易班自动答题脚本_自动答题脚本教程及源码分享(无视分辨率)
- 阿里大淘系模型治理阶段性分享
- 利用Hilbert变换进行相位调制信号的解调
- ctrl+alt+方向键 与win7的旋转屏幕冲突解决
- svn 服务器创建文件夹,svn服务器创建文件夹
- python中如何将矩阵合并并多一个维度
- 基于SSH+MySQL+JSP的体育用品商城系统(附文档)
- 一个非常不错的JQ 插件库
- 新书推荐 | 数据流机器学习:MOA实例
- matplotlib简要画图
- 微信小程序云开发增加定时任务
- android立体3D效果_3D立体画,让你身临其境
热门文章
- 【Matlab 控制】利用 Matlab Function 绘制分段函数
- 【控制】《多无人机协同控制技术》周伟老师-第10章-多无人机协同目标跟踪飞行控制策略
- 【Matlab 图像】bwlabel() 连通域及图像分割
- 【步态识别】基于CNN、步态能量图+HOG特征提取的步态识别算法的MATLAB仿真
- 【机器学习基础】GBDT--梯度提升树实例分析完全解读
- Android Message解析
- CUBA在查询语句如何添加参数
- 【转】tcp链接的状态
- 数据库连接客户端使用(db2,oracle,mysql)
- Silverlight Telerik RadGridView动态增删行及行列操作(转载)