C++二阶构造函数

转自:http://blog.51cto.com/9291927/1896411

 

一、构造函数的问题

    构造函数存在问题:

    A、构造函数只提供自动初始化成员变量的机会

    B、不能保证初始化逻辑一定成功,如申请系统资源可能失败

    C、执行return语句后构造函数立即结束

    构造函数创建的对象可能是半成品对象,半成品对象是合法的对象,但是是程序bug的来源之一。因此实际工程开发过程中使用二阶构造模式。

二、二阶构造模式

    由于构造函数存在的潜在问题,实际工程开发中类对象的构造过程如下:

A、资源无关的初始化操作

资源无关的初始化操作一般不会出现异常的情况

B、系统资源相关的操作

与系统资源有关的操作如堆空间申请,文件访问可能会失败。

二阶构造模式的流程如下:

wKiom1icIgKSSZgwAADHo0SCFn4616.png

    二阶构造模式能够确保创建的对象都是完整初始化的。由于工程实践中类对象占用的存储空间比较大,一般需要分配在堆空间,因此二阶构造模式构造对象的方式舍弃了构造函数中将对象分配在栈和全局数据区的情况,只保留创建在堆空间的对象的构造。

二阶构造模式实例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
  
class  TwoPhaseCons 
{
private :
     TwoPhaseCons()  // 第一阶段构造函数
     {   
     }
     bool  construct()  // 第二阶段构造函数
    
         return  true
     }
public :
     static  TwoPhaseCons* NewInstance();  // 对象创建函数
};
  
TwoPhaseCons* TwoPhaseCons::NewInstance() 
{
     TwoPhaseCons* ret =  new  TwoPhaseCons();
  
     // 若第二阶段构造失败,返回 NULL    
     if ( !(ret && ret->construct()) ) 
     {
         delete  ret;
         ret = NULL;
     }
         
     return  ret;
}
  
  
int  main()
{
     TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
     
     printf ( "obj = %p\n" , obj);
  
     delete  obj;
     
     return  0;
}

转载于:https://www.cnblogs.com/judes/p/7967854.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当子类继承父类时,对于子类的构造函数的写法有一定的规律。如果父类有显式地声明了构造函数,子类最低限度需要实现父类中的一个构造函数。如果父类没有声明构造函数,子类可以选择不声明构造函数或者任意地书写构造函数。 当一个类中存在多个构造函数时,系统会自动选出匹配的构造函数。在子类中声明构造函数时,可以选择任意形式。在创建子类对象时,首先会调用父类默认的构造函数(编译器自动生成),然后调用子类的构造函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [c++ 子类构造函数初始化及父类构造初始化](https://blog.csdn.net/weixin_30619101/article/details/95982933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [c++ 类的构造函数及子类的构造函数](https://blog.csdn.net/wybnmsl/article/details/104175475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值