C++--对象的构造顺序与对象的销毁

一.对象的构造顺序

A.对于局部对象--当程序执行流到达对象的定义语句时进行构造
程序示例

为孟津等地区用户提供了全套网页设计制作服务,及孟津网站建设行业解决方案。主营业务为网站建设、成都网站建设、孟津网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

#include<iostream>
using namespace std;
class Test
{
    private:
        int mi;
    public:
        Test(int i)
        {
            mi=i;
            cout<<"Test(int i)="<<mi<<endl;
        }
        Test(const Test& obj)
        {
            mi=obj.mi;
            cout<<"Test(const Test& obj)"<<mi<<endl;
        }
};

int main()
{
    int i=0;
    Test a=i;
    while(i<3)
    {
        Test a1=++i;
    }
    if(i<4)
    {
        Test a2=a;
    }
    else
    {
        Test a(100);
    }
    return 0;
}

运行结果如图所示
C++--对象的构造顺序与对象的销毁
由运行结果可以看出,程序是按照程序流来实现的Test a=i首先被构造,输出Test(int i)=0,Test a1=++i输出Test(int i)=1,Test(int i)=2,Test(int i)=3;Test a2=a输出Test(const Test& obj)=0;
B.对于堆对象
1.当程序执行流到达new语句时创建对象
2.使用new创建对象将自动触发构造函数的调用
代码示例

#include<iostream>
using namespace std;
class Test
{
    private:
        int mi;
    public:
        Test(int i)
        {
            mi=i;
            cout<<"Test(int i)="<<mi<<endl;
        }
        Test(const Test& obj)
        {
            mi=obj.mi;
            cout<<"Test(const Test& obj)="<<mi<<endl;
        }
};

int main()
{
    int i=0;
    Test *a1=new Test(i);
    while(++i<10)
        if(i%2)
            new Test(i);
    if(i<4)
        new Test(*a1);
    else
        new Test(100);
    return 0;
}

运行结果如图所示
C++--对象的构造顺序与对象的销毁
C.对于全局对象
1.对象的构造顺序是不确定的
2.不同的编码器使用不同的规则确定构造顺序

二.对象的销毁

1.一般而言,需要要销毁的对象都应该做清理
2.解决方案
a.为每个类提供一个public的free函数
b.对象不在需要时立即调用free函数进行清理
C++--对象的构造顺序与对象的销毁
存在的问题
1.free函数只是一个普通的函数,必须显示的调用
2.对象销毁前没有做清理,很可能造成资源泄漏

析构函数
C++的类中可以定义一个特殊的清理函数
1.这个特殊的清理函数叫做析构函数
2.析构函数的功能与构造函数相反
定义:~ClassName()
1.析构函数没有参数也没有返回值类型声明
2.析构函数在对象销毁时自动被调用
代码示例

#include <iostream>
using namespace std;

class Test
{
    int mi;
public:
    Test(int i)
    {
        mi = i;
        cout<<"Test()"<<endl;
    }
    ~Test()
    {
        cout<<"~Test()"<<endl;;
    }
};

int main()
{
    Test t(1);    
    Test* pt = new Test(2);    
    delete pt;//使用new时  需要用delete进行删除
    return 0;
}

运行结果
C++--对象的构造顺序与对象的销毁
运行结果如图所示,使用~ClassName之后对构造函数进行了析构,并销毁

小结
1.局部对象的构造顺序依赖于程序的执行流
2.堆对象的构造顺序依赖于new的使用顺序
3.全局对象的构造顺序是不确定的
4.析构函数时对象销毁时进行清理的特殊函数
5.析构函数在对象销毁时自动被调用
6.析构函数是对象释放系统资源的保障

名称栏目:C++--对象的构造顺序与对象的销毁
本文网址:https://www.cdcxhl.com/article36/goccsg.html

成都网站建设公司_创新互联,为您提供品牌网站设计网站设计虚拟主机服务器托管微信公众号企业建站

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网页设计公司