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

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

Saved successfully!

Ooh no, something went wrong!