Bueno, generalmente los libros acerca del Visual C++ se concentran mas en como manejar el IDE y en el uso de las clases MFC, y no tanto en el lenguaje C++ en si. Yo te recomendaria que primero leyeras un libro que se enfoque totalmente hacia el lenguaje C++, y no tanto uno que hable sobre un compilador en particular. Uno excelente es el del creador del lenguaje C++, Bjarne Stroustrup, el cual se llama
El Lenguaje de Programacion C++, y me parece que ya va en su tercera edicion.
Precisamente en ese libro una recomendacion como regla practica es que evites en lo posible el uso de variables globales. Pero si eso es lo que quieres puedes probar a hacer un ejemplo sencillo para que te des cuenta como funciona.
En el IDE del Visual crea un proyecto en modo consola totalmente vacio. Agregale al proyecto un archivo .cpp con el siguiente codigo
Código:
#include <stdio.h>
extern int nGlobal;
void f ();
main ()
{
extern int nGlobal;
void f();
void g();
printf ("El valor de la variable global nGlobal es %d\n", nGlobal);
nGlobal *= 10;
f ();
g ();
f ();
}
Agregale al proyecto otro archivo .cpp con el siguiente codigo
Código:
int nGlobal = 10;
void f ()
{
printf ("Funcion f(): El valor de la variable global nGlobal es %d\n", nGlobal);
}
void g ()
{
int nGlobal = -1;
printf ("Funcion g(): El valor de la variable global nGlobal es %d\n", nGlobal);
}
corre el programa para que veas los resultados.
En el primer archivo repeti la misma linea con
extern y con la declaracion de la funcion
f () solo para que veas que no importa el que lo hagas varias veces. Tambien defini en la funcion
g () de nuevo la misma variable
nGlobal para que veas que esto no es un error y que la variable local oculta a la global cuando tiene el mismo nombre, de manera que el modificar a la local no afecta para nada a la global. Una de las razones por las cuales se aconseja evitar el uso de variables globales es que accidentalmente cambies su valor o que quieras cambiar su valor pero la variable este oculta por otra con el mismo nombre. Esto en pequeños programas se detecta facilmente, pero piensa en un proyecto grande, donde intervienen varias personas en su desarrollo, con miles o millones de lineas de codigo, entonces ahi se complicaria mas el detectar esto. Una manera de evitar esto es crear una variable miembro estatica en una clase, asi, al usarla o modificarla tendrias que anteponer el nombre de la clase, por lo que dejarias explicitamente tu intencion de lo que quieres hacer sin la posibilidad de que otra persona la modifique accidentalmente o este oculta por otra. Aqui esta un ejemplo. Modifica el proyecto anterior o crea uno nuevo similar y en un archivo pon
Código:
class COtraClase {
public:
void Modifica (int valor);
int Muestra ();
};
class CPrueba {
public:
static int nGlobal;
};
main ()
{
printf ("Valor de la variable nGlobal: %d\n", CPrueba::nGlobal);
CPrueba::nGlobal *= 10;
printf ("Valor de la variable nGlobal: %d\n", CPrueba::nGlobal);
COtraClase oc;
printf ("oc.- Valor de la variable nGlobal: %d\n", oc.Muestra ());
oc.Modifica (10);
printf ("oc.- Valor de la variable nGlobal: %d\n", oc.Muestra ());
CPrueba cp1, cp2;
printf ("Valor del miembro nGlobal del objeto cp1: %d\n", cp1.nGlobal);
cp1.nGlobal = 20;
printf ("Valor del miembro nGlobal del objeto cp2: %d\n", cp2.nGlobal);
}
y en el otro
Código:
class COtraClase {
public:
void Modifica (int valor);
int Muestra ();
};
class CPrueba {
public:
static int nGlobal;
};
int CPrueba::nGlobal = 10;
int COtraClase::Muestra () {
return CPrueba::nGlobal;
}
void COtraClase::Modifica (int valor)
{
CPrueba::nGlobal *= valor;
}
correlo y ve los resultados.
Cuando declaras un miembro de una clase como estatico, este miembro es comun a todos las instancias de la clase y no se crea una copia particular para cada objeto como es lo comun. Es por eso que al crear dos objetos distintos de la misma clase
CPrueba, el modificar el miembro
nGlobal en una, automaticamente se refleja este cambio en el miembro
nGlobal del otro objeto.
Cuando declaras un miembro como estatico en una clase, no se reserva ningun espacio en memoria para el, por lo que necesariamente tienes que definirlo en alguna parte de tu programa. Esto lo hice en el segundo archivo en la linea
Código:
int CPrueba::nGlobal = 10;