如:#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吗?

解决方案 »

  1.   

    静态成员,全局都要比main
      

  2.   

    粗略学一下win32asm,就会知道main/WinMain并不是程序最先执行的了。
      

  3.   

    静态成员的构造函数先执行。
    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) 
      

  4.   

    对于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++必知必会》,挺有收获的。
      

  5.   

    在main函数值钱执行,你调试下就知道了
    好像有个  __tmainCRTStartup(); 函数,具体是干啥的不知道,但可以通过调试找到,在此函数内部先执行
    一个_initterm 函数,后执行 main(argc, argv, envp);或者wmain(argc, argv, envp);函数进入应用程序入口
      

  6.   

    _initterm 就是初始化的相关函数