1、如何判断构造函数的执行结果?
构造函数没有返回值,所以不能通过返回值来判断是构造函数是否构造成功。
如果给构造函数强行加入一个返回值,用来表示是否构造成功。这样确实能够反映出构造的结果,但是不够优雅,有点呆。
2、在构造函数中执return 会发生什么?
当构造函数中执行return后构造函数直接返回,后面的程序将不能被执行到。这样将产生一个“半成品对象”。
3、构造函数执行结束是否意味着对象构造成功?
如果构造函数中具备申请内存的操作,那么申请内存的操作不可能百分之百成功,所以构造函数执行结束并不意味着构造成功。而声明的对象变成了“半成品对象”
综上所述:
构造函数只能够提供一个自动初始化变量的机会,不能保证初始化逻辑一定成功,执行return语句后构造函数立即结束。(构造函数能够决定的只是对象的初始状态,而不是对象的诞生。)
关于“半成品对象”的概念:
初始化操作不能按照预期的效果完成而得到对象。
半成品对象是合法的C++对象。
二阶构造模式:
所谓二阶构造模式,只是将构造分为两个阶段。
一个阶段为资源无关的初始化操作(例如赋值等不需要访问到系统资源的相关操作。)
第二阶段为与系统资源有关的操作(如申请内存,访问文件)。
二阶构造实验:
#include <stdio.h> class Test { private: int *pData; int lenght; Test(int pDataLenght);//第一阶段构造函数 bool construct() ;//第二阶段构造函数 public: static Test* newInstance(int pDataLenght);//对象创建 bool steData(int pDataTab,int val);//设置参数 bool getData(int pDataTab,int& pDataOut);//获取参数 ~Test(); }; Test::Test(int pDataLenght) { lenght = pDataLenght; } Test::~Test() { delete[] pData;//释放堆空间内存。 printf("this is Structure analysis function ");//构析函数 } bool Test::construct() { bool ret = true; pData = new int(lenght); if(pData) for(int i=0;i<lenght;i++) pData[i] = 0; else { ret = false; } return ret; } Test* Test::newInstance(int pDataLenght) { Test* ret = new Test(pDataLenght);//完成第一阶段构造 if(!(ret && ret->construct())) { delete ret; ret = NULL; } return ret; } bool Test::steData(int pDataTab,int val) { bool ret = true; if(pDataTab>=0 && pDataTab<lenght) { pData[pDataTab] = val; } else ret = false; return ret; } bool Test::getData(int pDataTab,int& pDataOut) { bool ret = true; if(pDataTab>=0 && pDataTab<lenght) { pDataOut = pData[pDataTab]; } else ret = false; return ret; } int main(void) { Test* obj = Test::newInstance(5);//使用二阶构造 只能使用静态函数进行创建 obj->steData(0, 10); for(int i = 0 ;i<5 ;i++) { int temp; if(obj->getData(i,temp)) printf("%d = %d ",i,temp); } delete obj; return 0; }
运行结果:
0 = 10 1 = 0 2 = 0 3 = 0 4 = 0 this is Structure analysis function