variable locales example estatica declarar atributo c++ c

c++ - locales - variable static java



¿Diferencia entre estática en C y estática en C++? (5)

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


El uso de estática en el alcance del archivo para restringir el acceso a la unidad de traducción actual está en desuso en C ++, pero sigue siendo aceptable en C.

En su lugar, use un espacio de nombres sin nombre

namespace { int file_scope_x; }

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

La razón 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, recibiría almacenamiento 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 la función.

Luego, la palabra clave se sobrecargó 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 cuando se hace referencia a funciones, ya que no se almacenan en ningún lugar).

Cuando aparecieron las clases en C ++ (y en Java y C #), la palabra clave se usó una vez más, pero el significado está 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.


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 la función estática puede acceder solo a variables estáticas, pero en C la función estática puede tener variables estáticas y no estáticas ... 😊


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 desaplicado 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 está en desuso al declarar objetos en el ámbito del espacio de nombres.


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;


La palabra clave static tiene los mismos propósitos 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 (p. Ej., Para el enlazador). 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 los datos, ya que eso rompe el principio central de la encapsulación).

    Si (como lo 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 artículo. 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 se ha desaprobado a favor de 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 se ha dedicado a eliminar gets() pesar de la cantidad de tiempo que todos hemos sabido que era una función peligrosa.

Y a pesar de que está obsoleto, eso no cambia su semántica ahora .