Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 288 — #326<br />
✐<br />
Capítulo 10. Control de nombres<br />
seguro. Los datos globales pued<strong>en</strong> ser modificados por todo el mundo y su nombre<br />
puede chocar con otros idénticos si es un proyecto grande. Sería ideal si los datos<br />
pudies<strong>en</strong> almac<strong>en</strong>arse como si fues<strong>en</strong> globales pero ocultos d<strong>en</strong>tro de una clase y<br />
claram<strong>en</strong>te asociados con esa clase.<br />
Esto es posible usando atributos static. Existe una única porción de espacio para<br />
los atributos static, indep<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te del número de objetos de dicha clase<br />
que se hayan creado. Todos los objetos compart<strong>en</strong> el mismo espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />
static para ese atributo, constituy<strong>en</strong>do una forma de «comunicarse» <strong>en</strong>tre<br />
ellos. Pero los datos static pert<strong>en</strong>ec<strong>en</strong> a la clase; su nombre está restringido al interior<br />
de la clase y puede ser public, private o protected.<br />
10.3.1. Definición del almac<strong>en</strong>ami<strong>en</strong>to para atributos estáticos<br />
Puesto que los datos static ti<strong>en</strong><strong>en</strong> una única porción de memoria donde almac<strong>en</strong>arse,<br />
indep<strong>en</strong>di<strong>en</strong>tem<strong>en</strong>te del número de objetos creados, esa porción debe ser<br />
definida <strong>en</strong> un único sitio. El compilador no reservará espacio de almac<strong>en</strong>ami<strong>en</strong>to<br />
por usted. El <strong>en</strong>lazador reportará un error si un atributo miembro es declarado pero<br />
no definido.<br />
La definición debe realizarse fuera de la clase (no se permite el uso de la s<strong>en</strong>t<strong>en</strong>cia<br />
inline), y sólo está permitida una definición. Es por ello que habitualm<strong>en</strong>te se incluye<br />
<strong>en</strong> el fichero de implem<strong>en</strong>tación de la clase. La sintaxis suele traer problemas,<br />
pero <strong>en</strong> realidad es bastante lógica. Por ejemplo, si crea un atributo estático d<strong>en</strong>tro<br />
de una clase de la sigui<strong>en</strong>te forma:<br />
class A {<br />
static int i;<br />
public:<br />
//...<br />
};<br />
Deberá definir el almac<strong>en</strong>ami<strong>en</strong>to para ese atributo estático <strong>en</strong> el fichero de definición<br />
de la sigui<strong>en</strong>te manera:<br />
int A::i = 1;<br />
Si quisiera definir una variable global ordinaria, debería utilizar<br />
int i = 1;<br />
pero aquí, el operador de resolución de ámbito y el nombre de la clase se utilizan<br />
para especificar A::i.<br />
Algunas personas ti<strong>en</strong><strong>en</strong> problemas con la idea que A::i es private, y pese<br />
a ello parece haber algo que lo está manipulando abiertam<strong>en</strong>te. ¿No rompe esto el<br />
mecanismo de protección Ésta es una práctica completam<strong>en</strong>te segura por dos razones.<br />
Primera, el único sitio donde esta inicialización es legal es <strong>en</strong> la definición.<br />
Efectivam<strong>en</strong>te, si el dato static fuese un objeto con un constructor, habría llamado<br />
al constructor <strong>en</strong> lugar de utilizar el operador =. Segundo, una vez se ha realizado<br />
la definición, el usuario final no puede hacer una segunda definición puesto que el<br />
<strong>en</strong>lazador indicaría un error. Y el creador de la clase está forzado a crear la definición<br />
288<br />
✐<br />
✐<br />
✐<br />
✐