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

Tim*_*ews 5 c++ multithreading locking

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

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

最后你回答在.dll,.so,.exe和linux可执行文件中是一样的吗?

Kon*_*lph 8

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

什么时候定义.

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

是.

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

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


Joh*_*itb 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.
}
Run Code Online (Sandbox Code Playgroud)

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

是的,据说这样的变量具有静态存储持续时间和命名空间范围。它的构造函数在程序启动时被调用。顺序是文件中定义的顺序。也就是说,稍后定义的变量将稍后调用其构造函数。未定义在不同翻译单元中定义的变量的顺序(注意静态初始化顺序失败)。但它们都是在程序启动时调用的。

如果多个线程正在访问 .dll 怎么办?

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