构造函数与析构函数的调用顺序:

一般情况下:同一性质下定义的变量,其构造函数与析构函数调用顺序相反:先构造的后析构(对称)

对象的构造函数和析构函数调用时机和它的生命周期是密不可分的

(1)全局对象(生命周期:程序运行时创建,程序结束时销毁)的构造函数在所有函数(包括main函数)执行之前调用。

但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用其析构函数。

(2)局部对象(在函数内定义的对象,其生命周期是进入该函数该语句创建,函数退出结束

在进入该函数建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束时调用析构函数。

(3)静态(static)局部对象(生命周期是第一次进入该函数创建,程序退出时销毁)

则只在程序第一次调用此函数建立对象时调用一次构造函数,在调用结束时对象并不被释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。

(4)动态创建的对象,是调用new关键字创建函数时调用构造函数,调用delete函数销毁对象时调用析构函数

1.全局变量

在主函数前调用构造函数,书函数运行结束后调用析构函数

定义类:

class A
{
    public:
    int a;
    A(int b=0):a(b)
    {
        cout << a << ":   " << "构造函数" << endl;
    }
    ~A()
    {
        cout<< a << ":   " << "析构函数" << endl;
    }
};

void fun()
{
	cout << "fun()开始" << endl;
	//全局对象
	 A a(0);
	 A a1(1);
	 A a2(2);
	cout << "fun()结束" << endl;
}

int main()
{
	cout << endl << "main()运行" << endl;
	fun();
	cout << endl << "main()结束" << endl;
	return 0;
}

输出:

由运行结果可知:构造函数与析构函数调用顺序相反(早构造晚析构)对称!

2静态局部变量

运行该定义语句执行构造函数,主函数结束调用析构函数

void fun()
{
	cout << "fun()开始" << endl;
	//动态对象
	static A a(0);
	static A a1(1);
	A a2(2);
	cout << "fun()结束" << endl;
}

int main()
{
	cout << endl << "main()运行" << endl;
	fun();
	cout << endl << "main()结束" << endl;
	return 0;
}

3.局部变量

运行到该句执行定义语句调用构造函数,局部变量所处函数结束时调用析构函数

void fun()
{
    //局部对象
    A a1(1);
    A a2(2);
    A a3(3);
}

int main()
{
    cout << endl << "main()运行" << endl;
    fun();
    cout << endl << "main()结束" << endl;
    return 0;
}

4.动态内存

new 时调用构造函数,delete时调用析构函数,没有delete的对象不调用析构函数

而new创建的数组对象,数组成员有几个,调用几次析构函数,而delete[]对象名;及代表对该数组内所有成员执行析构函数,几个成员执行几次;

int main()
{
	cout << endl << "main()运行" << endl;
	//动态对象
	A* a1=new A(1);
	A* a2=new A(2);
	A* a3=new A(3);
	delete a1;
	delete a2;
	delete a3;
	cout << endl << "main()结束" << endl;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值