20、二阶构造模式

本文详细介绍了二阶构造模式的原因、实现步骤、注意事项及实际应用。通过分两阶段构造对象,确保对象完整初始化,避免半成品对象带来的问题。文章以数组类为例,展示二阶构造在防止越界问题上的应用。
摘要由CSDN通过智能技术生成

此文编写参考狄泰软件学院唐佐林老师的视频课程,如有错误之处,欢迎指正。

一、为什么要引入二阶构造模式?

1、构造函数的缺点
(1)只提供自动初始化成员变量的机会
(2)不能保证初始化逻辑成功
(3)执行return语句后构造函数立即结束
由此可知,构造函数可能会构造出一个半成品对象,那么什么是半成品对象呢?
①初始化操作不能够按照预期完成而得到的对象
②半成品对象是合法的c++对象,也是bug的重要来源

2、所以为了解决半成品对象所带来的危害,就引入了二阶构造模式

二、如何进行二阶构造

所谓二阶构造也就是分两个阶段对对象进行构造。具体步骤如下所示:
在这里插入图片描述

第一阶段的构造是资源无关初始化操作,也就是一些不可能会出现异常情况的操作,如简单的赋值初始化等。
第二阶段的构造是系统资源申请的操作,这种操作是有可能出现异常情况的,如内存申请,访问文件等。

模式如下:

#include<stdio.h>
class Demo
{
   
private:
	Demo()//第一阶段构造
	{
   
	
	}
	bool TwoPhase() //第二阶段构造  
	{
        
         //........
          return true;//说明构造成功
	}
public:
	static Demo* NewInstance();
};
Demo* Demo::NewInstance()
{
   
	Demo* ret=new Demo();//第一阶段的构造
	if(!(ret->TwoPhase()&&ret))
	{
   
		delete ret;//构造失败,销毁对象
		ret=NULL;//将返回值赋值为空,标志创建失败
	}
	return ret;
}
int main()
{
   
	Demo* t1=Demo::NewInstance();
	printf("t1=%p\n",t1);
	delete t1;
	return 0;
}

在这里插入图片描述
从运行结果可以知道,程序成功地从堆空间中申请了一个类对象,且每运行一次返回的地址都不一样,也就是说这个对象确实是从堆中申请的。当我们将如下函数进行修改,则此时最后就会返回一个NULL值。。

bool TwoPhase() //第二阶段构造  
{
   
        //........
      return false;//说明构造失败
}

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值