[C con Clase] Tipo de almacenamiento de variable

Salvador Pozo salvapozo en gmail.com
Mie Jul 20 16:55:32 CEST 2016


Hola:

Primero de todo, bienvenido a la lista.
No hay problema en la consulta que has hecho, en realidad, podría usarse como ejemplo de consulta bien hecha. :)

Es una pregunta interesante, y en principio yo pensaría que cada objeto almacenaría sus propias variables estáticas.

Aunque por otro lado, sabemos que todos los objetos de la misma clase comparten el mismo código, así que podría pensarse que también comparten sus variables estáticas, ya que este tipo de variables se almacenan de forma diferente al resto de variables/objetos.

Pero para salir de dudas, lo mejor es probarlo con un ejemplo:
----8<------
#include <iostream>
#include <string>

using namespace std;

class ClaseA {
    public:
        ClaseA(const string n) : nombre(n) {}
        void FuncionA();
    private:
        string nombre;

};

class ClaseB {
    public:
        ClaseB(const string n1, const string n2) : CA1(n1), CA2(n2) {}
        void FuncionB();

    private:
        ClaseA CA1;
        ClaseA CA2;

};

void ClaseA::FuncionA() {
    static int v;

    v++;
    cout << nombre << ": " << v << endl;
}

void ClaseB::FuncionB() {
    CA1.FuncionA();
    CA2.FuncionA();
}

int main()
{
    ClaseB CB("A1", "A2");

    CB.FuncionB();
    CB.FuncionB();

    return 0;
}
----8<------

La salida de este programa es esta:
A1: 1
A2: 2
A1: 3
A2: 4

De modo que parece que todos los objetos de la misma clase usan la misma variable estática, aunque sea local a una función miembro.

Esto, de todos modos, nos indica cómo funciona el compilador, no cómo dice el estándar que debería funcionar. Pero intuyo que en este caso ambos son coincidentes.

La explicación más sencilla para este comportamiento es que los objetos estáticos tienen el mismo ámbito de existencia que la instancia del programa al que pertenecen. Es decir, que se crean en fase de compilación, por lo que no es posible crear una versión para cada objeto que se cree durante la ejecución del programa.

Hasta pronto.



Más información sobre la lista de distribución Cconclase