estático (palabra clave)

Palabra reservada en algunos lenguajes de programación

statices una palabra reservada en muchos lenguajes de programación para modificar una declaración. El efecto de la palabra clave varía según los detalles del lenguaje de programación específico, y se usa más comúnmente para modificar el tiempo de vida (como una variable estática ) y la visibilidad (según el enlace ), o para especificar un miembro de clase en lugar de un miembro de instancia en las clases.

Origen

En los predecesores de C, incluidos BCPL y B , ya existía un concepto de almacenamiento estático . [1] [2] , lo que significaba un almacenamiento que siempre existe. Sin embargo, en B, no había una staticpalabra clave, pero había una extrnpalabra clave para especificar el almacenamiento externo (externo a todas las funciones y debe definirse fuera de una función), que siempre es estático, en contraste con autola palabra clave, que declaraba una variable con almacenamiento automático : aparece siempre que se invoca la función y desaparece cuando se abandona la función. [2] Todas las variables deben declararse, como una de auto, extrno implícitamente como argumentos de la función.

C se desarrolló como sucesor de B, y se añadieron las palabras clave y como staticespecificadores de clase de almacenamiento , junto con y , que conservaron su significado de B. Sin embargo, en C se introdujo el concepto de enlace para variables fuera de las funciones. Un programa puede estar formado por múltiples unidades de compilación y enlazarse entre sí para formar un programa completo, en el que una variable o función puede especificarse como que tiene enlace interno (visible solo para su propia unidad de compilación) o enlace externo (visible para todo el programa). Estas palabras clave especifican tanto la duración del almacenamiento como el enlace de la siguiente manera: [3]registerautoextern

Clase de almacenamientoDuraciónEnlace
externestática (ejecución del programa)externo (todo el programa)
staticestática (ejecución del programa)interno ( sólo unidad de traducción ) para identificador de nivel superior
ninguno para variables de ámbito de bloque
auto,registerejecución de funciónninguno

Cada variable y función tiene una de estas clases de almacenamiento; si una declaración no especifica la clase de almacenamiento, se utiliza un valor predeterminado dependiente del contexto:

  • externpara todas las declaraciones de nivel superior en un archivo fuente,
  • autopara variables declaradas en cuerpos de funciones.

Entonces, en C, aunque la staticpalabra clave, cuando se usa en variables, siempre declara una variable con duración de almacenamiento estática, hay dos significados distintos de la palabra clave, dependiendo de dónde se use:

  • Declaración de nivel superior: para declarar un identificador con enlace interno en lugar de externo, aplicable tanto a variables como a funciones.
  • Declaración con alcance de bloque: para declarar una variable con una duración de almacenamiento estática en lugar de automática. C no admite funciones con alcance de bloque.

Por lo tanto, en C, el término "variable estática" tiene dos significados que son fáciles de confundir:

  1. Una variable con el mismo tiempo de vida que el programa, como se describe arriba (independiente del lenguaje); o
  2. (Específico de la familia C) Una variable declarada con la clase de almacenamiento static.

Las variables con clase de almacenamiento extern, que incluyen variables declaradas en el nivel superior sin una clase de almacenamiento explícita, están staticen el primer significado pero no en el segundo.

En C++ (no C), la staticpalabra clave también se puede utilizar para declarar que una variable miembro de una clase tiene una duración de almacenamiento estática, independiente de la duración de almacenamiento del objeto de clase en sí, y dicha variable debe definirse fuera de la clase. El efecto es que la variable se comparte entre todas las instancias de la clase, convirtiéndose en un miembro de la clase en lugar de un miembro de la instancia. Cuando se aplica a una función miembro (método), especifica que la función miembro opera independientemente de una instancia, lo que significa que no puede acceder a ningún miembro no estático de la clase ni al thispuntero.

Como especificador de duración de almacenamiento

La staticpalabra clave se utiliza en muchos lenguajes de programación para especificar que una variable local tendrá una duración de vida de todo el programa, preservada entre invocaciones de funciones, en lugar de tener su propia copia para cada invocación de función como en la duración de almacenamiento automático, heredada del uso en C.

Algunos ejemplos de lenguajes de programación que admiten el uso de staticpalabras clave para mantener las variables locales durante la invocación incluyen C , C++ , Objective-C , C# y PHP .

Los siguientes lenguajes de programación con sintaxis similar a C no admiten staticvariables locales como en C: Java , JavaScript y Dart . En estos lenguajes, una variable que se conserva durante toda la ejecución del programa debe declararse fuera de las funciones.

Como especificador de visibilidad

La staticpalabra clave en C, cuando se utiliza como una declaración de nivel superior, hace que la variable o función sea visible solo para su propia unidad de compilación. Los lenguajes de programación modernos generalmente utilizan espacios de nombres para evitar conflictos de nombres, por lo que este uso no se adopta ampliamente, excepto en los lenguajes de programación que tienen en mente la compatibilidad con C (por ejemplo, C++ , Objective-C ). Otros lenguajes de programación que admiten declaraciones de visibilidad en el nivel superior utilizan una variedad de otras palabras clave para especificar diferentes niveles de visibilidad, por ejemplo, publicen Java para clases que se pueden usar en todas partes, o internal/ fileen C#. [4]

Como especificador de miembro de clase

La staticpalabra clave se utiliza en la mayoría de los lenguajes de programación con clases para especificar que un miembro sea un miembro de la clase, en lugar de un miembro de instancia, heredado del uso de C++.

Un miembro estático de una clase tiene las siguientes características:

  • Independientemente de cualquier instancia de clase, se puede acceder utilizando el nombre de la clase en lugar de una expresión que tenga el tipo de objeto de la clase.
  • Para los campos: existen durante toda la vida útil del programa (es decir, tienen una duración de almacenamiento estática).
  • Para los métodos: no se puede acceder a ningún miembro no estático sin una expresión de objeto (que implícitamente hace referencia a la instancia actual) o la thisreferencia a la instancia actual.

Algunos lenguajes de programación incluso van más allá, permitiendo el uso de staticpalabras clave en otros lugares de una declaración o uso de clase, por ejemplo:

  • Inicializadores estáticos en Java y JavaScript, que se ejecutan una vez cuando se carga la clase
  • Constructores estáticos en C#, que se ejecutan una vez antes de que se use la clase
  • Clases estáticas en C#, que no se pueden instanciar.
  • Las clases internas en Java llevan implícitamente una thisreferencia al objeto de la clase externa y deben existir en el contexto de una instancia de la clase externa. Al declarar una clase interna como static, no lleva dicha referencia y se puede usar independientemente de una instancia de la clase externa.
  • La staticpalabra clave se puede utilizar en lugar de un nombre de clase real para acceder a miembros estáticos y proporcionar polimorfismo a nivel de clase, llamados enlaces estáticos tardíos [5].

Como especificador decierres

La staticpalabra clave se puede utilizar en algunos lenguajes de programación en funciones anónimas para evitar la captura de estados que se capturan de forma predeterminada. Es similar a las variables locales estáticas y a los miembros de clase estáticos en el sentido de que un cierre estático no depende de la invocación en ejecución de la función que la contiene.

  • PHP: Los cierres construidos en un método de instancia tienen la $thisreferencia automáticamente vinculada a él, la staticpalabra clave evita esto.
  • C#: Los cierres por defecto tienen todas las variables locales y de instancia capturadas en ellos, la staticpalabra clave especifica que no se deben capturar estados externos. [6]

Véase también

Referencias

  1. ^ "MANUAL DEL PROGRAMADOR DE SISTEMAS MULTI TIC·-1" (PDF) .
  2. ^ ab Kernighan, BW UNA INTRODUCCIÓN TUTORIAL AL ​​LENGUAJE B (PDF) . Murray Hill, Nueva Jersey: Laboratorios Bell. pag. 4.
  3. ^ "Especificadores de clase de almacenamiento". cppreference.com .
  4. ^ "Modificadores de acceso (Guía de programación de C#)". Microsoft.
  5. ^ "Enlaces estáticos tardíos". Manual de PHP .
  6. ^ "Funciones anónimas estáticas". Microsoft.
Retrieved from "https://en.wikipedia.org/w/index.php?title=Static_(keyword)&oldid=1252624129"