在C++中,不同位置定义的对象,构造函数、析构函数被调用的时机都是不一样的。

全局对象最先被调用构造函数,最后被调用析构函数

在main中的对象依次被调用构造函数。在程序结束时,对于普通对象,采取先进后出的原则,调用析构函数。

对于static的静态对象,先调用其他函数中的对象的析构函数,然后再调用main中static对象的析构函数。这一切都是依照LIFO的原则来执行的。

通过以下代码来做这个小实验:

CreateAndDestroy.h

#pragma once
#include<string>
using namespace std;

#ifndef CREATE_H
#define CREATE_H

class CreateAndDestroy
{
public:
	CreateAndDestroy(int, string);
	~CreateAndDestroy();//析构函数
private:
	int objID;
	string message;
};

#endif



CreateAndDestroy.cpp

#include "CreateAndDestroy.h"
#include<iostream>
using namespace std;

CreateAndDestroy::CreateAndDestroy(int ID, string messageString)
	:objID(ID),message(messageString)
{
	cout << "Object" << objID << "	constructor runs	" << message << endl;


}

CreateAndDestroy::~CreateAndDestroy()
{
	cout << (objID == 1 || objID == 6 ? "\n" : "");
	cout << "Object " << objID << "	destructor runs		" << message << endl;


}

源.cpp

#include<iostream>
#include"CreateAndDestroy.h"
using namespace std;

void create(void);//函数原型


CreateAndDestroy first(1, "(global before main)");

int main()
{
	cout << "\nMAIN FUNCTION: EXECUTION BEGINS" << endl;
	CreateAndDestroy second(2, "(local automatic in main)");
	static CreateAndDestroy third(3, "(local static in main)");

	create();

	cout << "\nMAIN FUNCTION: EXECUTION RESUMES" << endl;
	CreateAndDestroy fourth(4, "(local automatic in main)");
	cout << "\nMAIN FUNCTION: EXECUTION ENDS" << endl;

}



void create(void)
{
	cout << "\nCREATE FUNCTION: EXECUTION BEGINS" << endl;
	CreateAndDestroy fifth(5, "(local automatic in create)");
	static CreateAndDestroy sixth(6, "(local static in create)");
	CreateAndDestroy seventh(7, "(local automatic in create)");
	cout << "\nCREATE FUNCTION: EXECUTION ENDS" << endl;
}

转载请注明来源:https://www.longjin666.top/?p=811

欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~

你也可能喜欢

发表评论