标签:申请 clu 类的构造函数 异常情况 null 系统资源 没有 如何 不完全
A.关于构造函数#include <iostream>
using namespace std;
class Test
{
int mi;
int mj;
public:
Test(int i, int j)
{
mi = i;
mj = j
}
int getI()
{
return mi;
}
int getJ()
{
return mj;
}
};
int main()
{
Test t1(1, 2);
cout<<"t1.getI()="<<t1.getI()<<endl;
cout<<"t1.getJ()="<<t1.getJ()<<endl;
return 0;
}
运行结果如图所示
可知当没在构造函数添加return返回值时,函数的运行结果是符合预期的,初始化逻辑成功了
当在构造函数添加return时
改动的过程运行的结果如图所示
由这次的运行结果我们可以知道,在添加return之后,打印的t1.getJ()的值为随机值,初始化失败了,由此可以推测执行到return语句后构造函数结束了
由此可以对之前提出的问题进行了解答
1.构造函数只提供自动初始化成员变量的机会
2.构造函数不能保证初始化逻辑一定成功
3.构造函数执行return语句后构造函数立即结束
半成品对象
半成品对象的概念:初始化操作不能按照预期完成而得到的对象,半成品对象时合法的C++对象,也是Bug的重要来源
二阶构造
工程开发中的构造过程可以分为
1.资源无关的初始化操作--不可能出现异常情况的操作
2.需要使用系统资源的操作--可能出现的异常情况,如:内存申请,访问文件
#include <iostream>
using namespace std;
class TwoPhaseCons
{
private:
TwoPhaseCons() // 第一阶段构造函数
{
}
bool construct() // 第二阶段构造函数
{
return true;
}
public:
static TwoPhaseCons* NewInstance(); // 对象创建函数
};
TwoPhaseCons* TwoPhaseCons::NewInstance()
{
TwoPhaseCons* ret = new TwoPhaseCons();
// 若第二阶段构造失败,返回 NULL
if( !(ret && ret->construct()) )
{
delete ret;
ret = NULL;
}
return ret;
}
int main()
{
TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
cout<<"obj="<<obj<<endl;//打印出obj的地址
delete obj;
return 0;
}
运行结果如图所示
小结:
1.构造函数只能决定对象的初始化状态
2.构造函数中初始化操作的失败不影响对象的诞生
3.初始化不完全的半成品对象是Bug的重要来源
4.二阶构造人为的将初始化过程分为两部分
5.二阶构造能够确保创建的对象都是完整初始化的
标签:申请 clu 类的构造函数 异常情况 null 系统资源 没有 如何 不完全
原文地址:https://blog.51cto.com/13475106/2410484