2012-08-30 3 views
7

Что различию между использованием:глобальная статическая переменная vs статическая переменная в функции?

static Foo foo; 
// ... 
foo.func(); 

И:

Foo& GetFoo(void) 
{ 
    static Foo foo; 
    return foo; 
} 

// ... 

GetFoo().func(); 

Что лучше?

+0

С глобальной переменной вы рискуете назвать конфликты имен. – VoidStar

+0

См. Http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c. –

+0

Ленивая инициализация. – iammilind

ответ

10

Главное отличие это когда строительство происходит. В первом случае это происходит где-то раньше, чем начинается main(). Во втором случае это происходит во время первого вызова GetFoo().

Возможно, в первом случае для кода (незаконно) использовать foo до его инициализации. Это невозможно во втором случае.

+0

Хотя намерение верное, достаточно усилий вы можете использовать функцию static (в C++ 03) до инициализации посредством рекурсивных вызовов функции. –

1

A GetFoo обычно используется, когда вы не хотите копировать свой класс/объект. Например:

class Foo 
{ 
private: 
    Foo(){}; 
    ~Foo(); 
public: 
    static Foo* GetFoo(void) 
    { 
     static Foo foo; 
     return &foo; 
    } 

    int singleobject; 
}; 

Вы можете получить доступ к внешним singleobject через Foo::GetFoo()->sinlgeobject. Частные конструкторы и деструкторы не позволяют вашему классу создавать копии.

Для использования static Foo foo у вас должны быть объявлены публичные конструкторы, что означает, что вы всегда получаете к нему свой класс, но ваш класс также сможет получать копии.

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