变量赋值的顺序

时间:2015-03-12 23:04:15

标签: c++

以下内容改编自代码:

void func()
{
  static MyClass a = init_func();

  a_global_var = null;
}

C ++编译器是否保证第一个赋值在第二个赋值之前?

3 个答案:

答案 0 :(得分:3)

是。但我不禁想到为什么你需要依赖它。

第一次调用该函数时,a初始化为init_funca_global_var稍后设置为“null”之前返回的任何内容

请注意,由于a是静态的,所以这仅在第一次调用函数时发生。随后的所有时间a_global_var都会设置为null,而a不会对此功能进行任何更改。

答案 1 :(得分:1)

第一行不是"赋值"。这是初始化。因为它是在块作用域中声明的静态对象的初始化,所以当控件第一次通过它时,即当你第一次调用你的函数时,它将只执行一次

第二行确实是一项任务。它将在每次控制传递时执行,即每次调用函数时都会执行。

这意味着您的问题仅在第一次调用此函数时才有意义。在这种情况下,保证初始化在赋值之前。在所有后续调用中,该问题根本不适用,因为不再执行初始化。

答案 2 :(得分:0)

  

" C ++编译器是否保证第一次分配在第二次分配之前?"

是的,它有保障。

无论如何,你应该考虑在单身中处理这个问题(如果你真的需要全局访问它):

class MyClass {
public:
    static MyClass& instance() { // <<< replaces func()
        static MyClass a;
        return a;
    }

    void* global_var() { return a_global_var; }
private:
    MyClass() : a_global_var(nullptr) { // <<< replaces init_func()
    }
    void* a_global_var;

};