【C++深度剖析学习总结】 27 二阶构造模式
作者 CodeAllen ,转载请注明出处
1.构造函数的回顾
关于构造函数
- 类的构造函数用于对象的初始化
- 构造函数与类同名并且没有返回值
- 构造函数在对象定义时自动被调用
2.问题
- 1.如何判断构造函数的执行结果?没有办法
- 2.在构造函数中执行return语句会发生什么?构造函数立即返回
- 3.构造函数执行结束是否意味着对象构造成功?并不意味着构造成功
异常的构造函数
#include <stdio.h>
class Test
{
int mi;
int mj;
bool mStatus;
public:
Test(int i, int j) : mStatus(false)
{
mi = i;
return;
mj = j;
mStatus = true;
}
int getI()
{
return mi;
}
int getJ()
{
return mj;
}
int status()
{
return mStatus;
}
};
int main()
{
Test t1(1, 2);
if( t1.status() ) //利用手动的添加返回值控制
{
printf("t1.mi = %d\n", t1.getI());
printf("t1.mj = %d\n", t1.getJ());
}
return 0;
}
3.构造函数
- 只提供自动初始化成员变量的机会
- 不能保证初始化逻辑一定成功
- 执行return语句后构造函数立即结束
4.真相的意义
构造函数能决定的只是对象的初始状态,而不是对象的诞生!!
5.半成品对象
半成品对象的概念
- 初始化操作不能按照预期完成而得到的对象
- 半成品对象是合法的C++对象,也是Bug的重要来源
- 难调的Bug:野指针、半成品对象
- IntArray 半成品对象的危害
6.二阶构造—变成品对象的解决方案
核心:将构造过程一分为二
原理层面:
工程开发中的构造过程可分为
- 资源无关的初始化操作
- 不可能出现异常情况的操作
- 需要使用系统资源的操作
- 可能出现异常情况,如:内存申请,访问文件
- 可能出现异常情况,如:内存申请,访问文件
代码层面:
二阶构造示例一
二阶构造示例二
小结
构造函数只能决定对象的初始化状态
构造函数中初始化操作的失败不影响对象的诞生
初始化不完全的半成品对象是Bug的重要来源
二阶构造人为的将初始化过程分为两部分
二阶构造能够确保创建的对象都是完整初始化的