构造函数和析构函数

三种构造函数:

1.无参构造函数

2.有残构造函数

3.copy构造函数

析构函数

构造函数的调用方式:

1.隐式(自动调用)

2.显式(手动调用)

3.copy构造函数的几种调用时机

匿名对象的去和留

#include <iostream>
using namespace std;
class Test{
private:
    int a;
    int b;
public:
    Test(){//无参构造函数
        a = 3;
        b = 5;
        cout << "我是构造函数,被执行了" << endl;
    }
    Test(int _a, int _b){//带参数的构造函数
        a = _a;
        b = _b;
        cout << "我是带参数构造函数,被执行了" << endl;
    }
    Test(const Test &obj){//赋值构造函数(copy构造函数)
        a = obj.a;
        b = obj.b;
        cout << "我是拷贝构造函数,被执行了" << endl;
    }
    ~Test(){//析构函数
        cout << "我是析构函数,被调用了" << endl;
    }

    void print(){
        cout << "a: " << a << " b: " << b << endl;
    }
};



/* 实验1 */
void stage1()//搭建一个舞台,将展示构造函数和析构函数调用的时机
{
    cout << "experiment 1" << endl;
    Test t0;//自动调用(隐式)
    Test t1(1, 2);//手动调用(显式)
    Test t2 = t1;//用另一个对象去初始化这个对象,会调用copy构造函数
    Test t3;
    t3 = t1;//直接将一个对象赋值给另一个对象,不调用如何构造函数
    //当它们的生命周期结束,编译器会对每个对象调用析构函数
}

/* 实验2 */
void f(Test p){
    p.print();
}
void stage2()//搭建舞台2,将展示当对象做函数参数时的运行机制机制(copy构造函数的调用时机)
{
    cout << "experiment 2" << endl;
    Test b;
    //1.展示f()函数
    f(b);//b实参去初始化形参p,这是会调用copy构造函数,将b拷贝给形参p
    //当局部变量p的生命周期完成时,调用p的析构函数
}

/* 实验3 */
//结论:函数的返回值是一个元素(复杂类型的),返回的是一个新的匿名对象,所以会调用匿名对象类的copy构造函数
//然后g函数中的A对象会被析构
Test g()
{
    Test A(1, 2);
    return A;
}
void stage3()
{
    Test B;
    B = g();//用匿名对象,赋值给B对象(扶正),然后匿名对象析构,匿名对象赋给B后,立马被析构掉
    //再比如
    Test B1 = g();//用匿名对象初始化B1,此时c++编译器直接将匿名对象转成B1(扶正)
}

int main()
{
   stage1();
    stage2();
    stage3();
    return 0;
}

实验1:



实验2:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值