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 200 — #238<br />
✐<br />
Capítulo 6. Inicialización y limpieza<br />
la posibilidad de introducir errores durante la modificación. Pero, ¿cómo determinar<br />
el tamaño del array La expresión sizeof c / sizeof *c (el tamaño del array<br />
completo dividido <strong>en</strong>tre el tamaño del primer elem<strong>en</strong>to) es un truco que hace que<br />
no sea necesario cambiarlo si cambia el tamaño del array 6 :<br />
for(int i = 0; i < sizeof c / sizeof *c; i++)<br />
c[i]++;<br />
Dado que las estructuras también son agregados, se pued<strong>en</strong> inicializar de un modo<br />
similar. Como <strong>en</strong> una estructura estilo-C todos sus miembros son públicos, se<br />
pued<strong>en</strong> asignar directam<strong>en</strong>te:<br />
struct X {<br />
int i;<br />
float f;<br />
char c;<br />
};<br />
X x1 = { 1, 2.2, ’c’};<br />
Si ti<strong>en</strong>e una array de esos objetos, puede inicializarlos usando un conjunto anidado<br />
de llaves para cada elem<strong>en</strong>to:<br />
X x2[3] = { {1, 1.1, ’a’}, {2, 2.2, ’b’} };<br />
Aquí, el tercer objeto se inicializó a cero.<br />
Si alguno de los atributos es privado (algo que ocurre típicam<strong>en</strong>te <strong>en</strong> el caso de<br />
clases bi<strong>en</strong> diseñadas <strong>en</strong> <strong>C++</strong>), o incluso si todos son públicos pero hay un constructor,<br />
las cosas son distintas. En el ejemplo anterior, los valores se han asignado<br />
directam<strong>en</strong>te a los elem<strong>en</strong>tos del agregado, pero los constructores son una manera<br />
de forzar que la inicialización ocurra por medio de una interfaz formal. Aquí, los<br />
constructores deb<strong>en</strong> ser invocados para realizar la inicialización. De modo, que si<br />
ti<strong>en</strong>e un constructor parecido a éste,<br />
struct Y {<br />
float f;<br />
int i;<br />
Y(int a);<br />
};<br />
Debe indicar la llamada al constructor. La mejor aproximación es una explícita<br />
como la sigui<strong>en</strong>te:<br />
Y y1[] = { Y(1), Y(2), Y(3) };<br />
Obt<strong>en</strong>drá tres objetos y tres llamadas al constructor. Siempre que t<strong>en</strong>ga un constructor,<br />
si es una estructura con todos sus miembros públicos o una clase con atributos<br />
privados, toda la inicialización debe ocurrir a través del constructor, incluso si<br />
está usando la inicialización de agregados.<br />
6 En el segundo volum<strong>en</strong> de este libro (disponible librem<strong>en</strong>te <strong>en</strong> www.BruceEckel.com), verá una<br />
forma más corta de calcular el tamaño de un array usando plantillas.<br />
200<br />
✐<br />
✐<br />
✐<br />
✐