狄泰C++课程学习笔记:第二十七课:二阶构造

    所谓“二阶构造”,其实就是说当某个类的构造函数中,既涉及到类中成员变量的初始化操作,又涉及到系统资源(如申请堆空间、打开外部文件等等)的申请,且该种申请可能会失败的情况时,我们可以将传统的一个构造函数的主体人为的拆分成为2步来进行:

    * 第一步:形式上就是传统的构造函数,不同的是这里需要将该构造函数的访问属性设置为private,在该构造函数中只进行类中普通成员变量的初始化操作,一般的,纯粹的赋值操作不会发生意外(不成功的情况)

    * 第二步:一般的,类中额外定义一个名为construct()的私有成员方法,该方法中,进行该类的实例化操作时涉及到的系统资源的申请工作,返回值表示申请的成功或失败

注:

    在二阶构造中,我们需要把上述2步涉及到的成员方法(包括构造函数和construct()的访问属性均设置为private),然后再额外的定义一个public的名为newInstance()的static成员方法,用来进行实际的类对象的定义。

    在这个newInstance()成员方法中,会首先在堆空间上申请类对象所占用的内存空间,然后通过该类对象调用construct成员方法进行系统资源的申请操作,最终表现为:对象实例化成功,则返回该对象的指针,对象实例化失败,则返回一个NULL空指针

具体小例如下:

  1 #include <stdio.h>
  2
  3 class Test
  4 {
  5 private:
  6     int _mPara1;
  7     int _mPara2;
  8     int* _mP;
  9
 10     Test()
 11     {
 12         _mPara1 = 1;
 13         _mPara2 = 2;
 14     }
 15     bool construct()
 16     {
 17         bool ret = true;
 18
 19         _mP = new int(5);
 20
 21         if(!_mP)
 22         {
 23             ret = false;
 24         }
 25
 26         return ret;
 27     }
 28 public:
 29     static Test* newInstance()
 30     {
 31         Test* ret = new Test();
 32
 33         if(!(ret && ret->construct()))
 34         {
 35             delete ret;
 36             ret = NULL;
 37         }
 38
 39         return ret;
 40     }
 41     void print()
 42     {
 43         printf("*_mP = %d\n", *_mP);
 44         printf("_mPara1 = %d\n", _mPara1);
 45         printf("_mPara2 = %d\n", _mPara2);
 46     }
 47 };
 48
 49 int main(int argc, char** argv)
 50 {
 51     Test* t  = Test::newInstance();
 52
 53     t->print();
 54
 55     return 0;
 56 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值