C++构造函数、拷贝函数、析构函数的调用顺序

一.三种函数的介绍和调用情况 

       构造函数:与类同名,无返回值,一般为public访问属性,特殊情形使用privated和protected构造防止外部随意创建对象

作用:1.初始化数据成员为期望值;

2.提供调试窗口,在构造函数内跟踪对象的初始化赋值情况,获知内存情况。

例:class A{

                        private: int x;

                        public: A() { x=0;}

                    };  //注意此为构造函数的声明 不要忘了“;”

触发调用构造函数的情况:初始化数据成员时

        拷贝构造函数:通过复制另一个对象已有的状态值(所以数据成员均复制)来初始化对象

例:定义一个拷贝函数

class A{

                private: int x;

                public: A() { x=0;} //构造函数

                          A(const A& obj) { this.x = obj.x} //拷贝构造函数

             };

注意:拷贝构造函数只有一个参数,这个参数是本类的对象(不能是其他类的对象),而且采用对象的引用的形式(加const声明,使参数值(此处的obj)不能改变,以免在调用此函数时因不慎而使对 象值被修改)

触发调用拷贝的情况:

1.显示调用:当一个同类对象来初始化新定义的对象时触发拷贝构造调用

2.隐式调用:值传递——1.在调用函数时需要将实参对象完整地传递给形参,需要建立一个实参的拷贝;2.函数调用完毕将返回值带回函数调用处时。此时需要将函数中的对象复制一个临时对象并传给该函数的调用处

析构函数:函数名与类同名,析构前加“~”,且只有无参的形式。负责对象销毁后的收尾工作,即对象所在的函数已调用完毕时,系统会自动执行析构函数。(与构造函数相反,一个“创造”,一个“销毁”)

例:析构函数的定义

class A{

                private: int x;

                public: A() { x=0;} //构造函数

                          ~A() {  cout<<"Destructor"<<endl; }} //析构函数完成对象资源的销毁工作

             };

触发调用析构的情况:

1.函数使用完后,生命周期结束

2.处于带返回值函数的内

3.delete释放堆区空间时

注意:当没定义拷贝构造函数和析构函数时,系统会自动定义和调用拷贝构造函数和析构函数

 二.整体调用顺序的实例        


A f(A a)
{
    return a; // A GlobalTemp = a;
}

int main()
{
    A b;
    A ret = f(b);
}

注意:在函数f里 return a时,会发生一次值传递给系统临时变量(eax寄存器),这里命名为GlobalTemp,类似于全局变量)

调用顺序为:

1.b.A() //初始化b时 调用无参构造函数A

2.a.A(b) //形参a被实参b赋值时 调用默认拷贝构造函数A&

3.GlobalTemp.A(a) //return a时发生一次值传递,拷贝给临时变量 调用拷贝函数

4.a.~A() //对象a生命周期结束,销毁 调用析构函数

//5.ret.A(GlobalTemp) //返回到主函数初始化 ret = GlobalTemp 调用拷贝构造函数

5,6两句因为编译器优化,不会在编译器中显示

//6.GlobalTemp.~A() //临时变量GlobalTemp生命周期结束,销毁 调用析构函数

7.ret.~A() //对象ret生命周期结束,销毁  调用析构函数

8.b.~A() //对象b生命周期结束,销毁  调用析构函数

我们可以发现:

1.析构函数的调用与其他函数的调用是一一对应的;

2.因为函数栈存储采用“后进先出”的调用形式,所以在主函数main中,ret先析构,b最后析构

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值