Pregunta

He escuchado que hay diferencias entre los idiomas acerca del significado de la palabra clave static , pero no he encontrado una buena lista que consolide esas diferencias.

Esto es lo que sé sobre el significado de estático en C ++:

  • Para las variables estáticas locales dentro de una función, la variable se inicializa al inicio y el valor se guarda en todas las llamadas de función.
  • Los miembros de datos estáticos se comparten entre todas las instancias de una clase. En otras palabras, solo hay una instancia de un miembro de datos estáticos. Los miembros de datos estáticos deben inicializarse en el alcance del archivo.
  • Las funciones de miembro estático solo tienen acceso a miembros estáticos.
  • En el código recursivo, se garantiza que un objeto o variable estática tiene el mismo estado en diferentes instancias de un bloque de código.
  • Los objetos estáticos y las variables definidas en el ámbito del archivo solo tienen vínculos internos. Ningún otro archivo puede usarlos.

¿Cómo cambia el significado de estático en otros idiomas?

¿Fue útil?

Solución

C


  • La palabra clave puede cambiar el vínculo o la duración (vida útil) de un objeto.
  • Las variables siempre se inicializan a 0
  • Las funciones tienen enlace interno.
  • Si se declara en el alcance del nivel de archivo: las variables tienen una vinculación interna y una duración estática (es decir, existe durante la vida útil del programa)
  • Si se declara en el ámbito del bloque: las variables no tienen vinculación sino una duración estática
  • Puede haber varias declaraciones de la misma variable estática en una unidad de traducción. Sin embargo, tenga en cuenta que deben ser los mismos. Por ejemplo: a nivel de archivo:

int a;        // a has external linkage

static int a; // a now has static linkage
              // same as if you wrote: static int a = 0;

//...

static int b; // static linkage

extern int b; // extern loses its meaning, b still has internal linkage

//...

extern int b; // b has external linkage

static int b; // error

//...

void func() {
  static int x; // automatic linkage, static duration
                // same as if you wrote: static int x = 0;
}

C++


  • En el ámbito de nivel de archivo, el uso ha quedado en desuso tanto para las variables como para los miembros en favor de los espacios de nombres anónimos. Existe solo como compatibilidad
  • Las variables aún se inicializan por defecto (como en C) a 0
  • " 6.7 La inicialización cero (8.5) de todos los objetos locales con duración de almacenamiento estático (3.7.1) o duración de almacenamiento de subprocesos (3.7.2) se realiza antes de que se realice cualquier otra inicialización [... ] "
  • Las variables tienen una duración de almacenamiento estático a menos que estén acompañadas por un especificador thread_local (de C ++ 0x en adelante)
  • Solo puede haber una definición de estática en una unidad de traducción
  • Las variables / funciones miembro significan que son propiedades de la clase y no las instancias Sintaxis de acceso legal: instance.property o Class :: property
  • Las funciones miembro estáticas solo pueden acceder a las variables miembro estáticas No este puntero para tales funciones
  • Sin embargo, los miembros no estáticos pueden acceder a cualquier miembro estático
  • A nivel de archivo, los objetos tienen vínculos internos, excepto los miembros de clase que tienen un alcance de clase.
  • Los miembros de la clase deben definirse ya sea en la declaración de la clase o de forma explícita a través del nombre de la clase y el operador de resolución de alcance
  • No se puede usar esto en un método estático

ActionScript


  • Métodos de clase como en C ++
  • no puede usar this o super en un método estático
  • Se accede solo a través del nombre de la clase y no del nombre de la instancia
  • No se hereda
  • Sin embargo, las clases derivadas tienen acceso a las propiedades estáticas de las bases
  • Las variables que se declaran con las palabras clave estática y constante deben inicializarse al mismo tiempo que se declara la constante

Diseño orientado a objetos


  • El patrón de diseño de Singleton es considerado por muchos como un objeto estático glorificado
  • Se utiliza en el patrón de diseño de fábrica

Es posible que me haya perdido muchas otras cosas, no dudes en participar.

Otros consejos

En Delphi, la palabra clave estática se usa exclusivamente para definir métodos de clase. En Delphi, un método de clase normal se puede declarar virtual y sobrescribir en una subclase. Además, Delphi tiene una variable self , similar al puntero this en otros idiomas. Sin embargo, en un método de clase, el self apunta a la clase en la que se llama al método en lugar de una instancia.

Declarar un método de clase static significa:

  1. No se puede anular en una subclase
  2. No tiene un self puntero

Esto significa que un método de clase estática solo puede acceder a los miembros de la clase en la clase en la que se definió, mientras que un método de clase normal puede acceder a los miembros de la clase anulados en clases derivadas.

Hay otros usos informales de la estática en la documentación de Delphi que generalmente se refieren a una característica de inmutabilidad (¿es eso una palabra?). Por ejemplo, una matriz estática frente a una matriz dinámica. Todos los métodos de instancia en Delphi son estáticos a menos que se indique lo contrario.

En VB.NET, una variable Static es como una variable estática local de C ++.

Sin embargo, no hay un Static para toda la clase; utilice Shared en su lugar.

En C # hay 3 formas en que se puede usar una palabra clave estática:

  • En la definición de clase, lo que significa que la clase solo expondrá miembros estáticos y no se puede crear una instancia
  • En un miembro de la clase, lo que significa que se puede llamar al miembro sin tener que instanciar la clase.
  • En un constructor, lo que significa que siempre se llamará al constructor estático antes de llamar a un miembro estático. (En su mayoría son cuellos de botella de rendimiento y, por lo tanto, no se recomiendan)

Espero que esto ayude.

En C #, casi siempre significa: " relacionado con un tipo en lugar de una instancia del tipo " ;.

Python tiene el decorador @staticmethod, que cuando se aplica a un miembro de la clase, hace que el método esté disponible en la clase en lugar de en las instancias, y no pasa argumentos automáticos al método. El decorador de @classmethod realiza una función similar, pero pasa la clase como el primer argumento, haciéndolo mucho más útil.

En C, static marca una función o variable global como local al archivo en el que se encuentra.

Es un poco como privado en otros idiomas. Sorta.

Si está en una función, entonces estática preasigna esa variable en la sección de datos del binario, en lugar de en la pila en tiempo de ejecución.

En VB.NET, el nivel de procedimiento estático se usa para indicar que la variable está asociada con todas las ejecuciones del procedimiento (se conserva de una llamada a otra). Sin embargo, eso es un poco de uso arcano en una aplicación orientada a objetos.

La contraparte es " Compartida " lo que significa que el método o miembro es de nivel de tipo (no necesita una instancia para acceder a él).

Wikipedia resume muchos significados diferentes de static :

Métodos estáticos , variables estáticas , Typing static .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top