什么时候被称为构造函数?

时间:2009-01-17 00:05:00

标签: c++ multithreading locking

如果我在不使用指针和new的情况下在函数中途定义了一个类的局部变量实例,是否在进入函数或定义函数时调用构造函数?

如果我在文件中全局定义另一个类的实例,那么在首次加载可执行文件时会调用该构造函数吗?如果多个线程正在访问.dll会怎么样?

最后你回答的是.dll,.so,.exe和linux可执行文件中的相同内容吗?

3 个答案:

答案 0 :(得分:8)

  

如果我在不使用指针和new的情况下在函数中间定义了一个类的局部变量实例,那么构造函数是否会被调用o进入函数或定义它的位置?

定义时。

  

如果我在文件中全局定义另一个类的实例,那么在首次加载可执行文件时会调用该构造函数吗?

  

如果多个线程正在访问.dll会怎样?

DLL通常只为整个应用程序加载一次 - 事实上,DLL也有一个入口点,由应用程序的线程调用,但全局变量初始化在此之前发生,只发生一次。

答案 1 :(得分:1)

  

如果我在不使用指针和new的情况下在函数中途定义了一个类的局部变量实例,是否在进入函数或定义函数时调用构造函数?

此类变量具有局部范围。它们的构造函数在定义时被调用。对于局部静态,构造函数只被调用一次,因为静态将在多个函数调用和返回后存活。订单很重要,是定义的顺序:

void foo() {
    ....
    if(cond) {
        ...
        // called here: first for f, then for b
        static Foo f;
        static Bar b;
    }

    ...
    Foo f; // not static: called here, in every invocation of foo.
}
  

如果我在文件中全局定义另一个类的实例,那么在首次加载可执行文件时会调用该构造函数吗?

是的,据说这样的变量具有静态存储持续时间和命名空间范围。它的构造函数在程序启动时调用。顺序是它在文件中定义的顺序。也就是说,稍后定义的变量将稍后调用它的ctor。未定义在不同转换单元中定义的变量的顺序(查找静态初始化顺序fiasco )。但是他们都是在节目开始时被调用的。

  

如果多个线程正在访问.dll会怎样?

所有赌注都已关闭。变量只构造一次。之后,当您启动线程并访问它时,该变量必须是线程安全的,或者线程在访问变量时必须进行适当的锁定。

答案 2 :(得分:0)

对于.dll,它取决于编译器和C运行时(CRT)。对于随Visual Studio 2008 SP1发布的MSVC,.dll的CRT将在DLL_PROCESS_ATTACH时初始化全局对象并在DLL_PROCESS_DETACH时销毁它们,假设在DLL_PROCESS_ATTACH期间没有发生任何可怕的事情。