2012-08-30 15 views
7

¿Cuál es la diference entre el uso de:variable estática global vs variable estática en la función?

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

Y:

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

// ... 

GetFoo().func(); 

¿Qué es mejor?

+0

Con la variable global que corren el riesgo de conflictos de nombres. – VoidStar

+0

Ver http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c. –

+0

Inicialización lenta. – iammilind

Respuesta

10

La principal diferencia es cuando se produce la construcción. En el primer caso, ocurre en algún momento antes de que comience main(). En el segundo caso, ocurre durante la primera llamada al GetFoo().

Es posible, en el primer caso, para el código para (ilegalmente) utilizar foo antes de su inicialización. Eso no es posible en el segundo caso.

+0

Aunque la intención es correcta, con el suficiente esfuerzo se puede utilizar la función estática (en C++ 03) antes de la inicialización a través de llamadas recursivas a la función. –

1

Un GetFoo se utiliza generalmente cuando no desea copias de su clase/objeto. Por ejemplo:

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

    int singleobject; 
}; 

Usted puede acceder externamente a través de singleobjectFoo::GetFoo()->sinlgeobject. Los constructores privados y los destructores evitan que su clase obtenga copias creadas.

Para el uso de static Foo foo, debe tener constructores públicos declarados, lo que significa que siempre está accediendo a su clase, pero su clase también podrá obtener copias.

Cuestiones relacionadas