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。即是确保一、二阶段都执行成功才返回对象地址。