C++中的二阶构造函数


1 前言

  构造函数用于创建对象时对象成员的初始化,如赋初值、申请内存、加载文件等,即是自动完成对象的初始化任务。在C++语言中,构造函数执行顺序是:全局对象和静态对象的构造函数在main()函数执行之前会被调用执行;局部静态对象的构造函数是当程序第一次执行到具体相关语句时才被调用。


  实质上,不是所有对象初始化过程都是可以执行成功的,如内存申请失败、文件加载失败等,此时构建的对象我们称为半成品对象。半成品对象在使用过程会引发一些异常问题,内存访问出错、段错误、系统崩溃。


2 二阶构造

  二阶构造,即是将普通构造函数拆分为两个函数:

  • 第一阶段构造函数:与资源申请无关的操作,一定执行成功的操作;如赋值,内存清零;
  • 第二阶段构造函数:需申请资源的操作,可能存在失败的返回;如内存申请,文件加载。

在这里插入图片描述

二阶构造函数执行过程



#include <iostream>
#include <string>
 
using namespace std;
 
class structure
{
public:
	structure *create_obj();
private:
	structure();	/* 第一阶段构造函数 */
	bool second_struct();/* 第二阶段构造函数 */
	int m_init;
    int *m_pbuf;
}

structure::structure()
{
	m_init = 0x00;
}

bool structure::second_struct()
{
	m_pbuf = new int(1024);

	if (m_pbuf)
	{
		return true;
	}
	else
	{
		return false;
	}
}

structure* structure::create_obj()
{
	structure *p= new structure();

	if (!(p	& p->structure()))
	{
		delete p;
		p = NULL;
	}
	return p;
}

int main(int arc, char **argv)
{
	structure *pobj = structure::create_obj();
	if (NULL != pobj)
	{
		/* todo */
		delete pobj;
	}
}

3 总结

  采用二价构造函数,将构造函数拆分为两个阶段,避免忽略资源申请失败导致二价构造失败,进而引发半成品对象的出现。一阶构造函数会调用默认构造函数生产对象,这一阶段是一定执行成功的。二阶构造函数执行资源申请操作,如果申请成功则返回创建的对象地址,否则删除一阶段创建的对象,返回NULL。即是确保一、二阶段都执行成功才返回对象地址。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acuity.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值