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

一、构造函数的问题

构造函数存在问题:

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

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

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

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

二、二阶构造模式

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

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

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

B、系统资源相关的操作

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

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

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

二阶构造模式实例代码:

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;
}

C++二阶构造函数的更多相关文章

  1. 14.C++-二阶构造模式、友元(详解)

    首先回顾以前所学的构造函数 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在定义时被自动调用 由于构造函数没有返回值不能判断执行结果,所以不能保证初始化对象能否成功 比如: c ...

  2. C++之二阶构造模式

    前言:C++中经常会因为调用系统资源失败导致出现BUG,所以在类调用构造函数需要分配系统资源时会出现BUG,从而导致类对象虽然被创建,但是只是个半成品,为了避免这种情况需要使用二阶构造模式 二阶构造模 ...

  3. C++解析(15):二阶构造模式

    0.目录 1.构造函数与半成品对象 2.二阶构造 3.小结 1.构造函数与半成品对象 关于构造函数: 类的构造函数用于对象的初始化 构造函数与类同名并且没有返回值 构造函数在对象定义时自动被调用 问题 ...

  4. C++ 二阶构造模式

    1.如何判断构造函数的执行结果? 构造函数没有返回值,所以不能通过返回值来判断是构造函数是否构造成功. 如果给构造函数强行加入一个返回值,用来表示是否构造成功.这样确实能够反映出构造的结果,但是不够优 ...

  5. C++中的赋值操作符重载和拷贝构造函数

    1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2 ...

  6. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  7. javascript工厂模式和构造函数模式创建对象

    一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...

  8. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  9. PHP与JAVA构造函数的区别

    早期的PHP是没有面向对象功能的,但是随着PHP发展,从PHP4开始,也加入了面向对象.PHP的面向对象语法是从JAVA演化而来,很多地方类似,但是又发展出自己的特色.以构造函数来说,PHP4中与类同 ...

随机推荐

  1. React资料

    基于ReactNative开发的APPhttp://reactnative.cn/cases.htmlhttp://www.cnblogs.com/qiangxia/p/5584622.html F8 ...

  2. CentOS中Apache虚拟主机(virtualHost)设置在/home目录下的若干问题

    在Ubuntu中安装LAMP是非常简单的意见事情.但是在CentOS中却遇到了很多问题. 首先是CentOS中必须手动配置iptables,把80端口开放出来,不然,是访问不到的,开放80端口在/et ...

  3. XAMPP修改mysql的默认密码的三种方法

     How I can set a "root" password in MySQL? (method 1) In the \xampp\mysql\bin directory en ...

  4. iOS-数组,字典常用的字面量写法

    解决方法: //用字面量创建数组 NSArray *array = @[@"one",@"two"]; //用字面量创建字典 NSDictionary *dic ...

  5. Android实例-使用电话拨号器在移动设备上

    Android实例-使用电话拨号器在移动设备上 源文地址: http://docwiki.embarcadero.com/RADStudio/XE5/en/Mobile_Tutorial:_Using ...

  6. sql server数据库行转列及巧用case when、和row_number用法例子

    select 身份证号码, MAX(t.单位编号) 单位编号, MAX(t.姓名) 姓名, MAX(case when t.rows=1 then convert(varchar(max),疾病名称) ...

  7. java怎么计算散列码hashcode?

    转自:https://blog.csdn.net/qq_21430549/article/details/52225801 1.从HashMap说起 我们知道Map以键值对的形式来存储数据.有一点值得 ...

  8. 微软Build 2017开发者大会午夜趴

    时间:2017年5月10号半夜 地点:微软中关村会议室 一年一度的Build大会,微软今年特地组织了一波粉丝到“现场”远程观摩keynote直播,同时在新浪直播间里也有相应的专家进行同步翻译和讲(tu ...

  9. StackExchange.Redis性能调优

    大家经常出现同步调用Redis超时的问题,但改成异步之后发现错误非常少了,但却可能通过前后记日志之类的发现Redis命令非常慢. PS: 以后代码都在Windows bash中运行,StackExch ...

  10. Editplus配置Monokai页面风格

    1.找到EditPlus的配置文件editplus_u.ini,用以下代码替换 [Options] Placement=2C00000002000000030000000083FFFF0083FFFF ...