• 二阶构造模式


    • 关于构造函数
    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. 二阶构造能够确保创建的对象是完整初始化的
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    分享:liblfds 6.1.0 发布,C 数据结构库
    strchr C++ Reference
    爱上MVC3系列~PartialView中的页面重定向
    基础才是重中之重~Conditional特性使代码根据条件在debug或者release模式中执行
    爱上MVC3系列~Html.BeginForm与Ajax.BeginForm
    爱上MVC3系列~Razor页面中的共享namespace不起作用了(解决自定义扩展方法不能识别的问题)
    爱上MVC3系列~RenderAction与RenderPartial及一个页面多个表单提交
    NHibernate Criteria中的And, Or
    poj 2528 Mayor's posters(线段树区点)
    探索iptables BPF模块的悲惨历程
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177923.html
Copyright © 2020-2023  润新知