Articulo de referencia

Variable de clase

En la programación orientada a objetos basada en clases , una variable de clase es una variable definida en una clase de la cual existe una única copia, independientemente de cu...

En la programación orientada a objetos basada en clases , una variable de clase es una variable definida en una clase de la cual existe una única copia, independientemente de cuántas instancias de la clase existan. [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ]

Una variable de clase no es una variable de instancia . Es un tipo especial de atributo de clase (o propiedad, campo o miembro de datos de clase). La misma dicotomía entre miembros de instancia y de clase se aplica también a los métodos ("funciones miembro"); una clase puede tener tanto métodos de instancia como métodos de clase .

Variables miembro estáticas y funciones miembro estáticas

En algunos lenguajes, las variables y los métodos de clase se resuelven estáticamente, sin despacho dinámico , o bien su memoria se asigna estáticamente en tiempo de compilación (una sola vez para toda la clase, como variables estáticas ), sin asignación dinámica en tiempo de ejecución (en cada instanciación de un objeto). En otros casos, sin embargo, uno o ambos procesos son dinámicos. Por ejemplo, si las clases se pueden definir dinámicamente (en tiempo de ejecución), las variables de clase de estas clases se asignan dinámicamente cuando se define la clase, y en algunos lenguajes los métodos de clase también se despachan dinámicamente.

Así, en algunos lenguajes, las variables miembro estáticas o las funciones miembro estáticas se utilizan como sinónimos o en lugar de "variable de clase" o "función de clase", pero no son sinónimos en todos los lenguajes. Estos términos se utilizan comúnmente en Java , C# , [ 5 ] y C++ , donde las variables de clase y los métodos de clase se declaran con la staticpalabra clave y se denominan variables miembro estáticas o funciones miembro estáticas .

Ejemplos

C++

clase Orden { privado : inline static int nextId = 0 ; int id ; público : Orden () : id { nextId ++ } {} };

En este ejemplo de C++, la variable de clase Order::nextIdse incrementa en cada llamada al constructor , de modo que Order::nextIdsiempre contiene el número de Orderobjetos que se han construido, y a cada nuevo Orderobjeto se le asigna un campo numberen orden secuencial. Dado que nextIdes una variable de clase, solo hay un objeto Order::nextId; en cambio, cada Orderobjeto contiene su propio idcampo distinto.

Tenga en cuenta también que la variable Order::nextIdse inicializa solo una vez (ya que inline staticse inicializa dentro de la clase; antes de C++17 , solo se inicializaba staticy tenía que inicializarse fuera de la clase).

Una clase con miembros que son instancias de sí misma solo puede declarar primero staticlos campos, mientras que las declaraciones constexpr deben residir fuera de la clase. Intentar declarar una instancia de una clase como miembro estático de sí misma falla, ya que ninguna definición de un objeto puede ser un tipo incompleto, y la clase permanece incompleta hasta que se cierra. [ 6 ]constconstexpr

struct Color { uint8_t r ; uint8_t g ; uint8_t b ;constexpr Color ( uint8_t r , uint8_t g , uint8_t b ) noexcept : r { r }, g { g }, b { b } {}constexpr ~ Color () = predeterminado ;constante estática Color NEGRO ; constante estática Color ROJO ; constante estática Color VERDE ; constante estática Color AMARILLO ; constante estática Color AZUL ; constante estática Color MAGENTA ; constante estática Color CIAN ; constante estática Color BLANCO ; };inline constexpr Color Color :: BLACK = Color ( 0 , 0 , 0 ); inline constexpr Color Color :: RED = Color ( 255 , 0 , 0 ); inline constexpr Color Color :: GREEN = Color ( 0 , 255 , 0 ); inline constexpr Color Color :: YELLOW = Color ( 255 , 255 , 0 ); inline constexpr Color Color :: BLUE = Color ( 0 , 0 , 255 ); inline constexpr Color Color :: MAGENTA = Color ( 255 , 0 , 255 ); inline constexpr Color Color :: CYAN = Color ( 0 , 255 , 255 ); inline constexpr Color Color :: WHITE = Color ( 255 , 255 , 255 );

Pitón

clase Perro : grupo_vertebrado : str = "mamíferos" # variable de claseperro : Perro = Perro () print ( perro.grupo_vertebrado ) # accediendo a la variable de clase

En el código Python anterior, no se proporciona mucha información, ya que solo hay una variable de clase Dogque indica que el perro pertenece al grupo de los vertebrados mamíferos. En una variable de instancia, se puede personalizar el objeto (en este caso, dog) mediante una o más variables de instancia en la Dogclase.

Esto también se puede sugerir mediante el uso de ClassVar.

from typing import ClassVarclase Perro : grupo_vertebrado : ClassVar [ str ] = "mamíferos"

Notas

  1. "El tutorial de Java, Variables" . Consultado el 21 de octubre de 2010 .
  2. "El tutorial de Java: Entendiendo los miembros de instancia y clase" . Consultado el 21 de octubre de 2010 .
  3. "The Python Language Reference, Compound Statements" . Consultado el 21 de octubre de 2010 .
  4. "Objective-C Runtime Reference" . Apple Developer . Consultado el 1 de abril de 2018 .
  5. 1 2 "Variables de clase en C#" . Syntaxdb . Consultado el 1 de abril de 2018 .
  6. WG21 (23 de abril de 2026). "Borrador del estándar C++ - Declaraciones y definiciones" . eel.is. WG21. En la definición de un objeto, el tipo de ese objeto no debe ser un tipo incompleto ([basic.types.general]), un tipo de clase abstracta ([class.abstract]) o una matriz (posiblemente multidimensional) de los mismos.{{cite web}}: CS1 maint: nombres numéricos: lista de autores ( enlace )