7、构造函数和析构函数被调用的时机

以下例说明构造函数和西沟函数被调用的时机。

class Demo {
	int id;
public:
	Demo(int i) {
		id = i;
		cout << "id=" << id << " constructed" << endl;
	}
	~Demo() {
		cout << "id=" << id << " destructed" << endl;
	}
};

Demo d1(1);
void Func()
{
	static Demo d2(2);
	Demo d3(3);
	cout << "func" << endl;
}
int main () {
	Demo d4(4);
	d4 = 6;
	cout << "main" << endl;
	{ Demo d5(5);
	}
	Func();
	cout << "main ends" << endl;
	return 0;
}
/*
输出结果:
id=1 constructed		全局变量d1被创建,之后进入main()函数。
id=4 constructed		执行Demo d4(4);转换构函数被调用。
id=6 constructed		执行d4 = 6;转换构造函数被调用。生成一个临时变量(对象),并且将临时变量赋值给d4
id=6 destructed			临时变量(对象)
main					执行cout << "main" << endl;
id=5 constructed		进入局部域中,执行Demo d5(5); 转换构造函数被调用
id=5 destructed			退出局部域,局部域中的d5对象被销毁
id=2 constructed		执行Func();执行static Demo d2(2);创建一个静态局部对象d2,转换构造函数被调用
id=3 constructed		执行Demo d3(3);转换构造函数被调用,创建对象d3
func					执行cout << "func" << endl;
id=3 destructed			退出Func()域,销毁其中的局部非静态变量d3,但是局部静态变量d2不被销毁
main ends				返回主函数,执行cout << "main ends" << endl;
id=6 destructed			main()函数执行完毕。main()函数中局部变量被销毁。
id=2 destructed			静态局部变量被销毁。
id=1 destructed			全局变量被销毁。
*/

注意:

  • 在学习完构造函数以后,代码不一定是先从main()函数开始执行的,因为程序中可能有全局对象,而全局对象的创建将会导致构造函数被执行。这段代码中便是Demo d1(1); 这条语句先执行。

  • 对于局部静态变量d2和全局静态变量d1,他们两个销毁的顺序时,先被初始化的后被销毁。因此d2先被销毁,d1再被销毁。

  • 对象被创建后即调用构造函数,对象被销毁前时即调用析构函数。

posted @ 2019-11-24 22:37  江南又一春  阅读(584)  评论(0编辑  收藏  举报