二阶构造模式

  • 关于构造函数
  1. 类的构造模式用于对象的初始化
  2. 构造模式与类同名并且没有返回值
  3. 构造函数在对象定义时自动被调用
  • 问题
  1. 如何判断构造函数的执行结果?
  2. 在构造函数中执行return语句会发生什么?
  3. 构造函数执行结果意味着对象构造成功?
 1 #include <stdio.h>
 2 class Test
 3 {
 4 private:
 5     int  mi;
 6     int  mj;
 7     bool mStatus;
 8 public:
 9     Test(int i,int j):mStatus(false)
10     {
11         mi = i;
12         return;
13         mj = j;
14         mStatus = true;
15     }
16     int getI()
17     {
18         return mi;
19     }
20     int getJ()
21     {
22         return mj;
23     }
24     int status()
25     {
26         return mStatus;
27     }
28 };
29 int main()
30 {
31     Test t(1,2);
32     if(t.status())
33     {
34         printf("t.mi=%d
",t.getI());
35         printf("t.mj=%d
",t.getJ());
36     }
37     return 0;
38 }
  • 构造函数
  1. 只提供自动初始化成员变量的机会
  2. 不能保证初始化逻辑一定成功
  3. 执行return语句后构造函数立即结束
    构造函数能决定的只是对象的初始状态,而不是对象的诞生。
  • 半成品对象的概念
  1. 初始化操作不能按照预期完成而得到的对象
  2. 半成品对象是合法的C++对象,也是bug的重要来源。
  • 工程开发中的构造过程可分为
  1. 资源无关的初始化操作,不可能出现异常情况的操作。
  2. 需要使用系统资源的操作,可能出现异常情况,如:内存申请(new),访问文件。
  •  二阶构造模式
  1. 所谓二阶构造 就是将对象的构造分为两个部分
  2. 第一部分:与资源无关的初始化,如对象中初始值的设置。
  3. 第二部分:与资源有关的初始化,如内存资源的申请,文件的访问等。
 1 #include <stdio.h>
 2 class TwoPhaseCons
 3 {
 4 private:
 5     //第一阶段构造函数
 6     TwoPhaseCons()
 7     {
 8     }
 9     //第二阶段构造函数
10     bool construct()
11     {
12         return true;
13     }
14 public:
15     //对象创建函数
16     static TwoPhaseCons*NewInstance();
17 };
18 //内部静态成员函数直接访问私有成员是合法的
19 TwoPhaseCons* TwoPhaseCons::NewInstance()
20 {
21     //通过动态内存分配创建一个对象,构造函数
22     //肯定会调用,执行第一阶段的构造函数
23     TwoPhaseCons*ret = new TwoPhaseCons();
24     //执行第二阶段构造函数
25     if(!(ret && ret->construct()))
26     {
27         delete ret;
28         ret = NULL;
29     }
30     return ret;
31 }
32 int main()
33 {
34     //因为构造函数是私有的,所以想用类名直接定义一个对象是不合法的
35     //在main函数中,无法访问类中的私有成员,所以可以在静态成员函数中
36     //访问类中的私有成员
37     //在堆空间中可以生成一个合法的,可以使用的对象
38     TwoPhaseCons*obj = TwoPhaseCons::NewInstance();
39     printf("obj = %p
",obj);
40     return 0;
41 }
小结:
  1. 构造函数只能决定对象的初始化状态
  2. 构造函数中初始化操作的失败不影响对象的诞生
  3. 初始化不完全的半成品对象是bug的重要来源
  4. 二阶构造人为的将初始化过程分为两部分
  5. 二阶构造能够确保创建的对象是完整初始化的
 
主要记录的是学习听课的笔记
原文地址:https://www.cnblogs.com/chengeputongren/p/12177923.html