【问题标题】:When does the constructor of a global object get called? [duplicate]什么时候调用全局对象的构造函数? [复制]
【发布时间】:2019-09-16 20:18:06
【问题描述】:

这是我写的一些代码:

#include <iostream>

class Number
{
    int n;
public:
    Number(int n)
    {
        std::cout << "Constructed object: " << n << std::endl;
        this->n = n;
    }
};

Number b = 2; //when does this ctor get called?

int main()
{
    Number a = 4;
}

输出:

Constructed object: 2
Constructed object: 4

什么时候调用全局对象的构造函数?就在main 被执行之前?

【问题讨论】:

    标签: c++


    【解决方案1】:

    什么时候调用全局对象的构造函数?在 main 执行之前?

    基本上,是的。在翻译单元中,对象按照它们出现的顺序构建。跨翻译单元的顺序是不确定的。

    对象以与其构造相反的顺序被销毁。

    对于 gcc(我认为也是 clang),另请参阅:How exactly does __attribute__((constructor)) work?

    【讨论】:

    • 正在寻找一个好的标准报价,但我记得命名空间中的对象可能有点模糊。
    • @user4581301 是的,这会改善答案(或发布您自己的答案)。
    • 挖掘Basic.start(C++17,或者尽可能接近我有一个链接。)讨厌的是零初始化和常量初始化的变量(它们首先发生)。之后的顺序就很正常了,直到你点击了thread-local 变量和inline 变量,它们可以在main 之后,但在第一次使用之前进行初始化。我认为我对这一切的理解还不够,无法写出答案,而且它远远超出了提问者所询问的情况。
    • @user4581301 是的,我也看了一下。这一切都说得通,但我同意,这超出了 OP 想知道的范围。我从中得到的主要内容是首先初始化没有构造函数的变量(这是您所期望的 - 它们是编译时构造),
    • @user4581301:这些都是好点。我将问题作为重复项关闭,因为您提到的例外情况不适用于此处。但是,您可以选择针对您在其中提到的案例提出类似问题并自行回答。
    【解决方案2】:

    是的,全局对象的构造函数在 main() 之前被调用

    更多信息: 在这里,我列出了何时为不同类型的对象(如全局、本地、静态本地、动态)调用构造函数

    1)对于你已经编写了一个程序的全局对象

    2)对于一个非静态的局部对象,当执行到声明对象的时候调用构造函数

    using namespace std; 
    class Test 
    { 
    public: 
    Test(); 
    }; 
    
    Test::Test() { 
        cout << "Constructor Called \n"; 
    } 
    
    void fun() { 
    Test t1; 
    } 
    
    int main() { 
        cout << "Before fun() called\n"; 
        fun(); 
        cout << "After fun() called\n"; 
        return 0; 
    } 
    /* OUTPUT: 
        Before fun() called 
        Constructor Called 
        After fun() called 
    */
    

    对于本地静态对象,第一次(也是第一次)执行到达声明对象的位置。 3)类范围:当一个对象被创建时,编译器确保它的所有子对象(它的成员和继承的对象)的构造函数都被调用。如果成员有默认构造函数或没有参数的构造函数,则这些构造函数会自动调用,否则可以使用初始化列表调用参数化构造函数。

    // PROGRAM 1: Constrcuctor without any parameter 
    #include<iostream> 
    using namespace std; 
    
    class A 
    { 
    public: 
    A(); 
    }; 
    
    A::A() { 
        cout << "A's Constructor Called \n"; 
    } 
    
    class B 
    { 
    A t1; 
    public: 
    B(); 
    }; 
    
    B::B() { 
        cout << "B's Constructor Called \n"; 
    } 
    
    int main() { 
        B b; 
        return 0; 
    } 
    /* OUTPUT: 
        A's Constructor Called 
        B's Constructor Called 
    */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2013-06-21
      相关资源
      最近更新 更多