zoukankan      html  css  js  c++  java
  • 二阶构造模式

    • 关于构造函数
    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. 二阶构造能够确保创建的对象是完整初始化的
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    8.10
    今日头条笔试题 1~n的每个数,按字典序排完序后,第m个数是什么?
    Gym 100500B Conference Room(最小表示法,哈希)
    CodeForces 438D The Child and Sequence(线段树)
    UVALIVE 6905 Two Yachts(最小费用最大流)
    Gym Conference Room (最小表示法,哈希)
    hdu 2389 Rain on your Parade(二分图HK算法)
    Codeforces Fox And Dinner(最大流)
    zoj 3367 Counterfeit Money(dp)
    ZOJ3370. Radio Waves(2-sat)
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12177923.html
Copyright © 2011-2022 走看看