Pregunta

Digamos que tengo este programa:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(Por supuesto, este ejemplo no tiene sentido, ya que obviamente declararía "contra" como un atributo privado, pero es solo para ilustrar el problema).

Me gustaría saber cómo se comporta C ++ en este tipo de situación: ¿la variable "contador" en el método bar () será el mismo para cada caso?

¿Fue útil?

Solución

Sí, counter se compartirá en todas las instancias de objetos de tipo Foo en tu ejecutable. Mientras esté en un entorno individual, funcionará como se esperaba como un mostrador compartido.

En un entorno múltiple, tendrás condiciones de carrera interesantes para depurar :).

Otros consejos

Por "ser lo mismo para cada caso" quiere decir que habrá una instancia de esta variable compartida en cada instancia de clase, entonces sí, eso es correcto. Todas las instancias de la clase utilizarán esa misma instancia variable.

Pero tenga en cuenta que con las variables de clase debe tener en cuenta cosas como el subproceso múltiple en muchos casos, que es un tema completamente diferente.

De El lenguaje de programación C ++ (2ª edición), página 200, por Bjarne Stroustrup:

No lo usas estático excepto las funciones dentro [de simple] (§7.1.2) y las clases (§10.2.4).

Su ejemplo estaba a un par de líneas de ser algo que podría compilar y probar:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

La salida se ve así:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

Entonces sí, el mostrador se comparte en todas las instancias.

Solo necesitas agarrar dos cosas:

  1. Las variables estáticas se almacenan en el área estática del programa de ejecución (que es la misma que la de la variable global).
  2. El alcance está limitado por las reglas generales de paréntesis. Las variables estáticas adicionalmente tienen un enlace interno.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top