《 C++深度剖析》学习日志十六——对象的构造顺序

        对象的构造顺序并不难,但是有很多bug会由对象的构造顺序产生,所以我们有必要梳理一下对象的构造顺序。

我们先提出一个问题:

        C++中的类可以定义多个对象,那么对象构造顺序是怎样的?

局部对象

       当程序执行流到达对象的定义语句时进行构造,我们来看下面的代码。

#include<stdio.h>
class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
};
int main()
{
    int i = 0;
    Test a1 = i;//Test(int i):0
    
    while( i < 3)
    {
        Test a2 = ++i;//Test(int i):1,2,3
    }
    
    if( i < 4)
    {
        Test a = a1;//Test(const Test& obj):0
    }
    else
    {
        Test a(100);
    }
}

结果显示就是顺序执行流影响对象的创建顺序。如果使用goto语句来改变他的顺序流呢?

#include<stdio.h>
class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
    int getMi()
    {
        return mi;
    }
};
int main()
{
    int i = 0;
    Test a1 = i;//Test(int i):0
    
    while( i < 3)
    {
        Test a2 = ++i;//Test(int i):1,2,3
    }
goto End;    
        Test a(100);
End:
    printf("a.mi = %d\n", a.getMi());
        
}

显然,在程序中跳过了a对象的创建,那么之后再调用a对象,便会出现错误,但不是所有的编译器都会报错,下面是标准编译器和VC++的编译器结果。

而VC++中的编译器默认了这样的写法


最后a对象生成了随机数,在实际工程中是灾难性的。

堆对象

        当程序执行流到达new语句时创建对象

        使用new创建对象将自动触发构造函数的调用

#include<stdio.h>
class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
    int getMi()
    {
        return mi;
    }
};
int main()
{
    int i = 0;
    Test* a1 = new Test(i);//Test(int i):0
    
    while( ++i < 10 )
    {
        if( i % 2 )
            new Test(i);//Test(int i):1, 3, 5, 7, 9
    }
    if( i < 4 )
        new Test(*a1);
    else
        new Test(100);//Test(int i):100
        
}

我们来看看程序执行符不符合我们的预期。

从结果看,是符合我们的预期的。

全局对象

        对象的构造顺序是不确定的

        不同的编译器使用不同的规则确定构造顺序

小结

        局部对象的构造顺序依赖于程序的执行流

        堆对象的构造顺序依赖于new的使用顺序

        全局对象的构造顺序是不确定的


以上资料均来自狄泰,群号:199546072,志同道合的朋友可以加我:
 qq:335366243
 微信:zhong_335366243

内容概要:本文介绍了基于Zernike矩的乳腺肿块良恶性分类方法,结合快速相反权重学习规则,在Matlab平台上实现了医学图像特征提取与分类的自动【基于Zernike矩的良性和恶性肿块的分类】应用于乳腺癌诊断中的快速相反权重学习规则(Matlab代码实现)化流程。Zernike矩用于提取乳腺肿块的形状和纹理特征,具有良好的旋转不变性,适用于医学图像分析;快速相反权重学习规则则用于优化分类过程,提高诊断准确率和效率。文中提供了完整的Matlab代码实现,便于研究人员复现和进一步优化算法。此外,文档还列举了多个相关科研方向和技术应用,展示了该方法在生物医学工程与智能诊断系统中的潜力。; 适合人群:具备一定Matlab编程基础,从事医学图像处理、模式识别、人工智能或生物医学工程领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于乳腺癌早期辅助诊断系统,提升医学影像分析的自动化水平;②作为科研教学案例,帮助理解图像特征提取(如Zernike矩)与智能分类算法的结合应用;③为优化医学图像分类模型提供可复现的技术路径与代码参考。; 阅读建议:建议读者结合提供的Matlab代码逐模块运行与调试,深入理解Zernike矩的特征提取机制及分类器训练过程,同时可拓展学习文档中提及的相关算法(如支持向量机、深度学习等),以构建更高效的医学图像分析系统。
内容概要:本文围绕“基基于非Copula理论的股票投资组合预测:利用高斯定理预测股票亏损风险研究(Matlab代码实现)于非Copula理论的股票投资组合预测:利用高斯定理预测股票亏损风险研究”展开,提出了一种不依赖Copula函数的金融风险建模方法,通过高斯定理对股票收益率的分布特性进行建模,进而预测投资组合的亏损风险。研究重点在于构建符合实际金融市场特征的风险评估模型,利用Matlab实现相关算法,对股票投资组合的尾部风险和极端亏损情况进行量化分析,并与传统Copula方法进行对比,突出非Copula方法在特定条件下的有效性与简洁性。文中还涉及风险价值(VaR)和条件风险价值(CVaR)等指标的应用,强化了模型在实际投资决策中的实用性。; 适合人群:具备一定金融工程、统计学或数量经济学背景,熟悉Matlab编程,从事金融风险管理、投资组合优化及相关领域研究的研究生、科研人员及金融行业从业者。; 使用场景及目标:①用于金融领域中股票投资组合的风险评估与管理;②为不希望引入复杂依赖结构建模(如Copula)的研究者提供替代性风险预测方案;③通过Matlab代码实现,帮助用户理解高斯定理在金融风险预测中的具体应用流程,支持学术研究复现与工业级风险监控系统开发。; 阅读建议:建议读者结合Matlab代码逐段理解模型构建过程,重点关注收益率分布假设、高斯定理的应用逻辑及风险指标的计算方法。同时可将该方法与文档中提及的Copula方法进行对比实验,以深入掌握不同建模思路的优劣与适用范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值