2010-02-10 17 views
5

Tengo algunas preguntas sobre la palabra clave estática en C++ (y probablemente también en otros idiomas). ¿Cuál es el propósito de declarar una función como estática?Preguntas sobre la palabra clave estática con funciones y datos

void static foo(int aNumber) { 
... }

¿Qué tal una función estática en línea?

void static inline foo(int aNumber) { 
... }

¿Hay alguna ventaja de usar la palabra clave estática con una función, y esos beneficios se aplican también a las funciones de clase? Me doy cuenta de que algunos tipos de datos como estructuras y matrices deben ser estáticos al compilar con un compilador anterior, pero ¿hay algún punto al usar un nuevo compilador ANSI-C++ (como MS VC++ 2008)? Sé que usar una variable estática dentro de un bucle ahorra tiempo manteniendo los datos en memoria y no reasignando memoria cada iteración de bucle, pero ¿qué ocurre cuando una variable se declara solo una vez, como en la parte superior de un archivo de encabezado o dentro de un espacio de nombres?

+0

¿Está preguntando específicamente sobre las funciones declaradas fuera de una clase/estructura? – Bill

+0

Estaba preguntando en general, gracias por el comentario, pero Brian ya respondió mis preguntas. – Dooms101

Respuesta

15

depende del contexto:

Como muchas cosas en C++, static significa cosas diferentes dependiendo de su contexto.

Es muy común en C++ que la misma palabra signifique cosas diferentes según su contexto.
Por ejemplo:

  • * se usa para la multiplicación, eliminación de referencias a un puntero, y la creación de punteros.
  • & se usa para obtener la dirección de las variables, para declarar una referencia y como un operador AND bit a bit.

uso global de la estática:

Si se declara una función o variable como fuera estática de una clase y de alcance mundial, que es específico para ese archivo. Si intenta usar esa variable o función en un archivo diferente (a través de una declaración directa) obtendrá un error de enlace.

Ejemplo:

a.cpp:

static void fn() 
{ 
    cout<<"hello a!"<<endl; 
} 

b.cpp:

void fn(); 
void gn() 
{ 
    fn();//causes linking error 
} 

Esta característica le permite utilizar una función que ningún otro archivo verá nunca, de esa manera no causar posibles errores de enlazador de un símbolo definido varias veces. El método preferido para hacer esto es con espacios de nombres anónimos sin embargo:

a.cpp:

namespace 
{ 
    void fn() // will be static to a.cpp 
    { 
    cout<<"hello a!"<<endl; 
    } 
} 

Dentro de un uso de clases de estática:

Si se declara una función o variable estática dentro de un clase (o estructura), es una función de clase o variable de clase. Esto significa que solo hay una para toda esa clase. Una función de clase solo puede usar variables de clase.Una variable de clase se comparte entre todas las instancias de esa clase.

class C 
{ 
public: 
    static void fn() 
    { 
    y = 4;//<--- compiling error 
    // can't access member variable within a static function. 
    } 

    int y; 
} 

Esta es una gran característica de usar si usted tiene algo que es específico de la clase de los objetos, pero no a una instancia específica.

Dentro de un uso de la función estática:

Si se declara una variable estática como en el interior de una función, se puede considerar que el valor de la variable se mantendrá cuando se reciban llamadas. Solo se inicializará una vez.

Ejemplo:

//Will print 0, then 1, then 2, ... 
void persistentPrintX() 
{ 
    static int x = 0; 
    cout << x << endl; 
    x++; 
} 

personalmente tratar de evitar esto, y probablemente debería hacerlo. No es bueno tener un estado global. Es mejor tener funciones que, con la misma entrada, garanticen el mismo resultado.

Al igual que en el idioma Inglés:

El concepto de significado contextual no es específico para C++, incluso se puede ver que en el idioma Inglés.

  • voy a screen una película (significa mostrar la película)
  • El screen en el televisor se rompe (Se refiere a una parte del televisor)

Otros significados en otros lenguajes de programación :

Según el lenguaje de programación puede haber un significado diferente, pero lo primero que la mayoría de la gente piensa cuando dice static es una clase vari capaz/función vs una variable/función miembro.

+0

El uso más confuso de estática. ¿No podrían haber usado 'privado'? – Yacoby

+0

Podrían pero entonces tendrían una palabra sobrecargada: significado privado cosas diferentes :) –

+1

Reutilizar palabras clave suena realmente tonto. Eso es como usar 'auto' para diferentes cosas. Oh, espera ... –

3

Me quedo en el canal ## C++ irc ​​en irc.freenode.net y realmente me gusta la aclaración en estática que el bot nolyc está programado para dar. Cito textualmente:

Cuando se utiliza dentro de una función, el palabra clave static indica que una variable es compartida entre todas las llamadas de la función. Cuando se usa dentro de una clase , indica que la variable o función es un miembro pero no está vinculada a una instancia específica. Cuando se utiliza dentro de un espacio de nombres, especifica el enlace interno .

Espero que aclare las cosas. No he respondido todas tus preguntas. Yo diría que debe usar la palabra clave static para hacer lo que estaba destinado a hacer. Úselo como una herramienta para completar su tarea, si es la correcta para el trabajo. En cuanto a los beneficios, no me preocuparía. Si necesita optimizar, piense en esos efectos si no hay otro recurso.

Espero que esto ayude.

Cuestiones relacionadas