我们在创建对象的时候,需要调用构造函数,对对象做初始化,但是构造函数是没有返回值的,无法判断构造函数的执行结果。如果构造函数执行过程中,发生了异常,导致函数提前返回了,那么这种情况下,我们创建的对象会处于什么状态。
1. 构造函数确定对对象做初始状态,对象的创建与构造函数无关,也就是说存储对象的那片内存已经完成分配
2. 如果构造函数出现了异常,提前返回,就会导致对象的状态的不确定性,变成变成半成品对象
因此,一般构造函数中是不允许有可能产生异常的代码,把可能产生异常的代码,放到第二阶段去完成,这就是二阶构造。
如以下代码(直接写的没有进过编译测试):
class Test{
private:
Test(){
array = NULL;
}
bool construc(int length){
array = new int[length];
if(array == NULL ){
return false;
}
return ture;
}
public:
int* array;
static Test* NewInstance(int length){
Test* ret = new Test();
if(! (ret && ret->construct(length))){
delete ret;
ret = NULL;
}
return ret;
}
}