13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!