Bootstrap

静态对象的探讨与全局对象的构造顺序

一:静态对象的探讨
(1)静态的类类型成员变量
直接上例子说明结论:

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include<stdlib.h>
using namespace std;
class A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
};

class B
{
public:
	static A obj; //声明。成员变量是一个静态的类类型
	//inline static A obj; //c++17新标准,即定义又声明
};
A B::obj;//定义
int main()
{
	//函数体为空
	return 0;
}
说明:主函数函数体为空,但是执行结果却调用了A的构造函数和析构函数,,原因正是由于static A obj的定义所导致,有定义一个静态类类型的成员变量时,即使没有去使用它,那么系统也会为它分配内存,所以就会调用构造函数。
	如果只是声明了一个静态的类类型的成员对象,那系统不会为这个静态的成员对象类型进行分配内存工作。

(2)函数中的静态对象

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

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

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

void fun()
{
	static A obj;//函数中的静态对象
}
int main()
{
	//没有调用fun()函数,这里没有调用构造函数和析构函数
	return 0;
}

说明:如果调用了fun函数,就会调用A的构造函数和析构函数,即使调用多次,那A obj也只会被构造一次,而析构的时候是程序结束时,,这个和静态的变量类似。

二:全局对象的构造顺序(全局变量)

;