欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

局部对象与全局对象的构造和析构

程序员文章站 2022-03-23 12:09:31
...

例程调试,很多细节问题。可以单步调试后,切入到反汇编进行观察。


#include "pch.h"
#include <iostream>
#include <vector>
#include <ctime>
#include<algorithm>

using namespace std;

namespace _nmsp1 //命名空间
{		
	//一:局部对象的构造和析构
	//主要出了对象的作用于,编译器总会在适当的地方插入调用对象析构函数的代码;
	class A
	{
	public:
		A()
		{
			cout << "A::A()" << endl;
		}
		~A()
		{
			cout << "A::~A()" << endl;
		}
		int m_i;
	};


	void func()
	{			
		int i;
		int j;

		//......
		/*if (1)
		{
			return;
		}*/
		//.......
		//....
		A obja;//现用现定义 ,对于局部对象,里边的m_i是随机值;
		obja.m_i = 10;

		int mytest = 1;
		if (mytest == 0) //swtich case return;
		{
			return;
		}		
		int b = 0;
		b = 10;
		return;
	}
}
namespace _nmsp2
{
	//二:全局对象的构造和析构
	//全局变量是放在数据段里的
	//全局对象,在不给初值的情况下,编译器默认会 把全局对象所在内存全部清0;
	//全局变量在编译阶段就会把空间分配出来(全局变量的地址在编译期间就确定好的)。
	//全局对象构造和析构的步骤:
	//a)全局对象g_aobj获得地址(编译时确定好的,内存也是编译时分配好的,内存时运行期间一直存在)
	//b)把全局对象g_aobj的内存内容清0的能力(也叫静态初始化)
	//c)调用全局对象g_aobj所对应的类A的构造函数
	//.....
	//d)main()
	//{
	//	//......
	//}
	//....
	//e)调用全局对象g_aobj所对应类A的析构函数

	class A
	{
	public:
		A()
		{
			cout << "A::A()" << endl;
		}
		~A()
		{
			cout << "A::~A()" << endl;
		}
		int m_i;
	};

	A g_aobj; //全局对象,该全局对象在main函数执行之前就被构造完毕,可以在main函数中直接使用了
	              //在main函数执行完毕后,才被析构掉的
	            

	void func()
	{
		printf("g_aobj全局对象的地址=%p\n", &g_aobj);
	}
}

//main函数开始之前要干很多事,比如全局对象的构建等等。
int main()
{	
	_nmsp2::g_aobj.m_i = 6;

	//_nmsp1::func();		
	_nmsp2::func();
	return 1;
}
//main函数结束之后要干很多事,比如析构函数的执行