如:#include <windows.h>
class aaaa
{
public:
aaaa(int a);private:
static aaaa mya;
};
aaaa::aaaa(int a)
{
MessageBox(NULL, "aaaa", "22", MB_OK);}aaaa aaaa::mya(10);
int main()
{
MessageBox(NULL, "main", "22", MB_OK);
return 1;
}
为什么 MessageBox(NULL, "aaaa", "22", MB_OK);它先执行了呢,程序不是先执行main吗?
class aaaa
{
public:
aaaa(int a);private:
static aaaa mya;
};
aaaa::aaaa(int a)
{
MessageBox(NULL, "aaaa", "22", MB_OK);}aaaa aaaa::mya(10);
int main()
{
MessageBox(NULL, "main", "22", MB_OK);
return 1;
}
为什么 MessageBox(NULL, "aaaa", "22", MB_OK);它先执行了呢,程序不是先执行main吗?
早
main或是WinMain并不是最先执行的函数,真正最先执行的函数是另外的函数。你看一下下面的文章:几 乎每个Windows下的C++程序员都应该知道main和WinMain,前者是控制台程序的入口函数,后者是Win32程序的入口函数。这些函数会在 静态初始化完毕后被调用,并且开始应用程序的主要工作。但是这些函数只不过是C/C++的入口函数, 而不是应用程序真正的入口函数,也就是说,操作系统装载应用程序后,它并不是直接调用我们的main/WinMain,而是调用另一个由CRT提供的函数,由那个函数进行一些初始化工作(包括静态初始化)以后再调用我们的入口函数。下面的表格中列出了在通常的Windows应用程序中CRT所提供的入口函数:
CRT入口函数
相应的C/C++入口函数
相应的应用程序类型
WinMainCRTStartup WinMain Win32应用程序(非Unicode)
wWinMainCRTStartup wWinMain Win32应用程序(Unicode)
mainCRTStartup Main Win32控制台程序(非Unicode)
wmainCRTStartup wmain Win32控制台程序(Unicode)
#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++必知必会》,挺有收获的。
好像有个 __tmainCRTStartup(); 函数,具体是干啥的不知道,但可以通过调试找到,在此函数内部先执行
一个_initterm 函数,后执行 main(argc, argv, envp);或者wmain(argc, argv, envp);函数进入应用程序入口