2009-06-03 20 views
47

¿Cuál es la diferencia entre la palabra clave estática en C y C++?Diferencia entre estática en C y estática en C++ ??

+0

No estoy preguntando por el miembro de la clase (datos o func) parte estática. ¿Hay alguna diferencia en la semántica en las variables estáticas definidas en el alcance del archivo en C y C++? –

+0

Entonces no hay diferencia. –

+0

Dup: http://stackoverflow.com/questions/620024/static-in-different-languages ​​ – ephemient

Respuesta

8

Tiene el mismo significado en ambos idiomas.

Pero C++ agrega clases. En el contexto de una clase (y, por lo tanto, una estructura) tiene el significado adicional de hacer que los miembros de la clase method/variable sean miembros del objeto.

class Plop 
{ 
    static int x; // This is a member of the class not an instance. 

    public: 
    static int getX() // method is a member of the class. 
    { 
     return x; 
    } 
}; 

int Plop::x = 5; 
+0

Pero el uso de estática en el nivel superior está obsoleto en C++. Está bien en C. – UncleO

+1

Definitivamente está en desuso (Anexo D.2), sin embargo, solo está en desuso para los objetos en el ámbito del espacio de nombres. –

+0

Echa un vistazo a la publicación de Pax. Este significado extra es analógico a todos los significados de estática. La palabra clave afecta la visibilidad y la duración de una variable en todos los escenarios, ya sea archivo, función o clase. Existe la misma regla detrás de todos estos escenarios. –

77

La palabra clave static tiene los mismos fines en C y C++.

  1. Cuando se utiliza a nivel de archivo (fuera de una función), establece la visibilidad del elemento al que se aplica. Los elementos estáticos no son visibles fuera de su unidad de compilación (por ejemplo, al vinculador). Su duración es la misma que la duración del programa.

    Estos elementos de nivel de archivo (funciones y datos) deben ser estáticos a menos que haya una necesidad específica de acceder a ellos desde fuera (y casi nunca hay necesidad de dar acceso directo a datos ya que eso rompe el principio central de encapsulación).

    Si (como indica su comentario a la pregunta) este es el único uso de static que le preocupa, entonces, no, no hay diferencia entre C y C++.

  2. Cuando se utiliza dentro de una función, establece la duración del elemento. Nuevamente, la duración es la misma que el programa y el ítem continúa existiendo entre las invocaciones de esa función.

    No afecta la visibilidad de ese elemento, ya que solo es visible dentro de la función. Un ejemplo es un generador de números aleatorios que necesita mantener su valor de inicialización entre invocaciones, pero no desea que ese valor sea visible para otras funciones.

  3. C++ tiene un uso más, static dentro de una clase. Cuando se usa allí, se convierte en una variable de clase única que es común en todos los objetos de esa clase. Un ejemplo clásico es almacenar el número de objetos que se han instanciado para una clase determinada.

Como han señalado otros, el uso de estática de nivel de archivo ha quedado en desuso en favor de los espacios de nombres sin nombre. Sin embargo, creo que será un día frío en un lugar cálido antes de que realmente se elimine del idioma; simplemente hay demasiado código usándolo en este momento. Y ISO C solo tiene solo se ha encargado de eliminar gets() a pesar de la cantidad de tiempo que todos hemos sabido que era una función peligrosa.

Y aunque está en desuso, eso no cambia su semántica ahora.

+2

Si bien la estática en el nivel de archivo cumple los mismos fines que los espacios de nombre sin nombre con respecto a la limitación de visibilidad de un archivo, existe una diferencia. Los estáticos tienen un enlace interno, mientras que el espacio de nombre sin nombre tiene un enlace externo (pero debido a un cambio de nombre aún no es accesible externamente) La vinculación externa de espacios de nombres sin nombre es necesaria para permitir que los tipos declarados en un espacio de nombre sin nombre se usen como parámetros de plantilla. – Pieter

+0

3/podría escribirse como: "Estático establece la duración de la variable de clase al mismo nivel que el programa. El estado estático no afecta la visibilidad de la variable, ya que ya es visible solo dentro de la clase". Calculé estas características comunes de estática en las 3 enumeraciones gracias a su publicación. No viste esto antes.+1 –

+1

Un punto que tengo que 2/- en C++ las variables estáticas del nivel de función que no son POD o que no se inicializan con constantes no se activan hasta que el control pasa a través de su declaración. Esto es importante porque, a diferencia de C, donde solo las constantes pueden inicializarlos, en C++ no es así, y aquí, también los constructores pueden causar otros efectos secundarios. –

12

El uso de estática en el ámbito de archivo para restringir el acceso a la unidad de traducción actual está en desuso en C++, pero todavía aceptable en C.

En su lugar, utilizar un espacio de nombres sin nombre

namespace 
{ 
    int file_scope_x; 
} 

variables declaradas de esta manera solo están disponibles dentro del archivo, como si estuvieran declarados estáticos.

El motivo principal de la desactivación es eliminar uno de los varios significados sobrecargados de la palabra clave estática.

Originalmente, significaba que la variable, como en una función, se almacenaría durante el tiempo de vida del programa en un área para tales variables, y no se almacenaría en la pila como es habitual para las variables locales de función.

A continuación, se sobrecargó la palabra clave para aplicarla a la vinculación del alcance del archivo. No es conveniente crear nuevas palabras clave según sea necesario, ya que pueden romper el código existente. Así que este se usó nuevamente con un significado diferente sin causar conflictos, porque una variable declarada como estática no puede estar tanto dentro de una función como en el nivel superior, y las funciones no tenían el modificador antes. (La connotación de almacenamiento se pierde por completo al referirse a las funciones, ya que no se almacenan en ningún lugar).

Cuando las clases aparecieron en C++ (y en Java y C#) la palabra clave se usó una vez más, pero el significado es al menos más cerca de la intención original. Las variables declaradas de esta manera se almacenan en un área global, a diferencia de en la pila como para las variables de función, o en el montón como para los miembros del objeto. Debido a que las variables no pueden estar tanto en el nivel superior como dentro de una definición de clase, el significado adicional puede vincularse sin ambigüedad a las variables de clase. Solo pueden referenciarse a través del nombre de la clase o dentro de un objeto de esa clase.

+2

Vale la pena leer la palabra clave "exportar". Un efecto secundario inesperado de la exportación es que una plantilla exportada en una unidad de traducción puede referirse a objetos y funciones en espacios de nombres sin nombre. En realidad, plantea la posibilidad de que el Comité C++ tenga que volver a instalar la estática en los objetos del espacio de nombres, ya que sin ella, no hay forma de garantizar que estas variables no sean visibles para otras unidades de traducción. –

+4

Se debe tener en cuenta que la eliminación estática del alcance del archivo se eliminó a partir de C++ 11, aunque todavía no se puede usar en los tipos. Sin embargo, más cambios son posibles en el futuro. – stan423321

6

Tenga en cuenta que el uso de estático para significar "alcance de archivo" (también conocido como ámbito de espacio de nombres) solo es deoprecated por el estándar C++ para objetos, no para funciones. En otras palabras ,:

// foo.cpp 
static int x = 0;    // deprecated 
static int f() { return 1; } // not deprecated 

Para citar el Anexo D de la Norma:

El uso de la palabra clave estática es obsoleto al declarar objetos en ámbito del espacio de nombres.

0

No se puede declarar una variable estática dentro de la estructura en C ... Pero se permite en Cpp con la ayuda del operador de resolución de alcance.

También en Cpp función estática puede acceder a las variables estáticas solamente pero en C función estática puede tener variables estáticas estático y no ...

Cuestiones relacionadas