GOOGLE ADS

sábado, 23 de abril de 2022

¿Por qué no tenemos que declarar funciones estáticas de la misma manera que necesitamos declarar variables estáticas en C++?

Considere la siguiente estructura:

struct Toto {
static int a;
static void Print() {
std::cout << a;
}
};

Y la siguiente función principal usando la estructura en el mismo archivo cpp (main.cpp):

int main()
{
Toto::Print();
}

Construir esto da el siguiente error:

Error LNK2001 símbolo externo no resuelto "public: static int Toto::a"

Entiendo de https://en.cppreference.com/w/cpp/language/static que

Los miembros estáticos de una clase no están asociados con los objetos de la clase.

Y por lo tanto, me dijeron que tenemos que declarar la variable Toto::a fuera de la estructura, en la unidad de transacción de la siguiente manera:

int Toto::a;

De la misma fuente dice que

Las funciones miembro estáticas no están asociadas con ningún objeto.

Y eso

Los miembros de datos estáticos no están asociados con ningún objeto.

¿Por qué tengo que declarar variables estáticas pero no funciones estáticas? ¿Es la convocatoria en sí misma una declaración? Si no, ¿qué más me permite eludir esa declaración?


Solución del problema

Las funciones miembro estáticas son funciones ordinarias a nivel de ensamblaje. La diferencia es solo el puntero oculto 'esto' que no existe en ellos. Son básicamente funciones globales que existen como cualquier otra función no estática o no miembro (y no en línea) dentro del ámbito de C++ de un nombre de clase. Los ámbitos de función son cosa de C++, no están allí en el nivel de la CPU.

Las variables estáticas son diferentes. Existen antes de que se cree cualquier objeto de clase. No se crean cuando se crea una instancia de clase. Están ahí como globales.

Tal vez esté hecho de la forma en que está hecho para enfatizar esa diferencia.

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...