对于c++来说规定:全局类型的数据会在进入主函数(main())之前就已经被分配地址和赋值了。并且一个全局变量会在main之前调用其构造函数(对于int等基本类型也可以看成是由构造函数的),然后再main之后再调用析构函数。正如下面的例子:
#include <iostream>
using namespace std;
class stud
{
public:
stud(int a)
{num=a;
cout<<"全局变量会在main()之前构造"<<endl;
}
~stud()
{
cout<<"全局变量也会在main()之后自动调用析构函数"<<endl;
}
private:
int num;
static stud self;
};
stud stud1(10);
int main()
{
cout<<"这是main()"<<endl;
return 0;
}
输出结果:
D:/>test.exe
全局变量会在main()之前构造
这是main()
全局变量也会在main()之后自动调用析构函数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另外值得一提的是类stud的成员:static stud self;
要注意:如果改成stud self;的话会编译错误,因为你不知不觉得来了个“递归定义”,并且这个递归却没有一个出口,所以会出错。
加上一个static就不一样了,我认为应该是静态变量是属于整个类的,而编译器对此的实现是采用的指针,来指向该类的在内存中静态区域,而指针可是一个已知的类型(x86里面占4B),所以不会出现错误;由此可知也可以改成stud *self;不会出错。
对于这些比较另类的c++知识推荐看一下《c++必知必会》,挺有收获的。