2015-03-12 3 views
-4

Следующая заимствован из кода:Порядок присвоения переменной

компилятор
void func() 
{ 
    static MyClass a = init_func(); 

    a_global_var = null; 
} 

ли C++ гарантирует, что первое задание, перед 2-й?

+1

Вы должны задать новый вопрос, а не редактировать текущий. Теперь мой ответ не имеет смысла. –

+0

Я возвращаю изменения, это должен быть новый вопрос. Более того, ваш модифицированный код больше не будет компилироваться, потому что вы не можете выполнять произвольные назначения вне функций. – Praetorian

ответ

3

Да. Но я содрогаюсь, чтобы подумать, почему вам нужно полагаться на это.

Первый раз, когда функция вызывается, a инициализируется с тем, что возвращается из init_func до того a_global_var позже установлен в «null»

Обратите внимание, что, как a статично, это происходит только в первый раз, когда функция называется. Все последующие времена, a_global_var устанавливается в null без каких-либо изменений в a этой функцией.

+0

Спасибо за ваш быстрый ответ, я только что обновил свой вопрос, на самом деле эти 2 заявления находятся вне любой функции. –

+0

Использование статической переменной в функции является довольно нормальным шаблоном –

+0

@MattMcNabb Использует статическую переменную в функции, которая требует, чтобы глобальная переменная была вручную установлена ​​на нуль после обычного шаблона? –

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; 

}; 
1

Первая строка не является «назначение». Это инициализация . Так как это инициализация объекта static, объявленного в области блока, он будет выполняться только один раз, когда элемент управления пройдет его в первый раз, то есть когда вы вызываете свою функцию в первый раз.

Вторая строка - действительно задание. Он будет выполняться каждый раз, когда элемент управления проходит через него, т. Е. Каждый раз, когда вы вызываете свою функцию.

Это означает, что ваш вопрос имеет смысл только в первый раз, когда эта функция вызывается. В этом случае завершение инициализации будет предшествовать назначению. Во всех последующих вызовах вопрос не будет применяться вообще, так как инициализация больше не будет выполняться.

Смежные вопросы