一般情况下:同一性质下定义的变量,其构造函数与析构函数调用顺序相反:先构造的后析构(对称)
对象的构造函数和析构函数调用时机和它的生命周期是密不可分的
(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;
}