C++二阶构造函数

一、构造函数的问题

构造函数存在问题:

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

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

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

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

二、二阶构造模式

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

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

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

B、系统资源相关的操作

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

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

wKiom1icIgKSSZgwAADHo0SCFn4616.png

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

二阶构造模式实例代码:

#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 = %pn", obj);
    delete obj;
    return 0;
}

类似于单例【但单例只有一个对象,这个有多个对象】,然后把构造函数设置为私有,获取对象只能用公共接口,接口里实现了构造函数了其他初始化函数。
原文链接: https://www.cnblogs.com/judes/p/7967854.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/264581

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午4:39
下一篇 2023年2月14日 下午4:40

相关推荐