开始执行

Sad*_*que 1 c++

请告诉我从c ++开始执行的地方,希望你的回答是"来自主要".

那怎么样?

class abc
{ 
public:
    abc()
    { 
        cout<<"hello";
    }
};

const abc obj;

int main( )
{ 
    cout<<"Main";
}
Run Code Online (Sandbox Code Playgroud)

输出:

helloMain 
Run Code Online (Sandbox Code Playgroud)

请详细说明.

Ama*_*osh 12

main调用之前,会创建全局变量(因此调用它们的构造函数).


回答OP的评论:

如果你想比你写的代码深入挖掘,那么之前发生的事情main就会被调用,我自己也没有清晰的画面.我在谈论我们编写的代码 - 其中入口点是main函数,在初始化全局变量之后调用它.碰巧,类实例的初始化意味着调用它的构造函数.

因此,简而言之,该行const abc obj;创建了一个类型的全局变量,abc该变量在被调用之前被初始化(它是带有print语句的默认构造函数)main.因此输出helloMain


Rak*_*kis 7

从您的评论到其他答案的支持,听起来 10,000 英尺的视野可能有助于理解。

启动应用程序所涉及的确切步骤因操作系统、编译器和编程语言而异,但“一般”过程本质上是相同的。

  1. 操作系统内核被要求启动一个运行目标可执行文件的新进程
  2. 内核创建一个新进程来承载可执行文件
  3. 内核设置基本进程属性:文件描述符、环境变量、安全属性等。
  4. 内核运行一个用户模式的“加载器”来实际打开包含可执行文件的文件并准备好执行
  5. 加载器读取包含可执行文件的文件并将其分解为不同的段:全局变量数据、可执行代码等
  6. 加载器解析任何动态链接库符号并为可执行代码正确布置内存(本质上,此步骤涉及确保程序中的所有指针都指向正确的位置)
  7. 然后加载程序调用可执行文件的“入口”函数。但是,这不是您的“主要”功能。“入口”函数通常被操作系统/编译器隐藏,以允许预主初始化代码运行。
  8. 在 C++ 的情况下,入口函数很可能如下所示:

int __entry( int argc, char *argv[] )
{
    // configure standard I/O streams, threading tables, & other utilities
    initialize_c_runtime(); 

    // run the constructors for all static objects
    initialize_static_cplusplus_objects(); 

    // Now, finally, after *all* that we execute the 'main' function
    return main(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)