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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 153 — #191<br />

✐<br />

4.3. El objeto básico<br />

ticam<strong>en</strong>te se asegura de que realizará esa declaración por medio de la inclusión de<br />

un fichero de cabecera. Además, si también incluye el mismo fichero de cabecera <strong>en</strong><br />

el mismo lugar donde se defines las funciones, el compilador verificará que las declaraciones<br />

del archivo cabecera y las definiciones coincid<strong>en</strong>. Puede decirse <strong>en</strong>tonces<br />

que, de algún modo, los ficheros de cabecera se vuelv<strong>en</strong> un repositorio de validación<br />

de funciones y permit<strong>en</strong> asegurar que las funciones se usan de modo consist<strong>en</strong>te <strong>en</strong><br />

todas las unidades de traducción del proyecto.<br />

Obviam<strong>en</strong>te, las funciones globales se pued<strong>en</strong> seguir declarando a mano <strong>en</strong> aquellos<br />

lugares <strong>en</strong> las que se defin<strong>en</strong> y usan (Sin embargo, esta práctica es tan tediosa<br />

que está <strong>en</strong> desuso.) De cualquier modo, las estructuras siempre se deb<strong>en</strong> declarar<br />

antes de ser usadas y el mejor lugar para esto es un fichero de cabecera, exceptuando<br />

aquellas que queremos esconder int<strong>en</strong>cionalm<strong>en</strong>te <strong>en</strong> otro fichero.<br />

Se puede ver que todas las funciones miembro (métodos) ti<strong>en</strong><strong>en</strong> casi la misma<br />

forma que sus versiones respectivas <strong>en</strong> C. Las únicas difer<strong>en</strong>cias son su ámbito de<br />

resolución y el hecho de que el primer argum<strong>en</strong>to ya no aparece explícito <strong>en</strong> el prototipo<br />

de la función. Por supuesto que sigue ahí ya que la función debe ser capaz de<br />

trabajar sobre una variable struct <strong>en</strong> particular. Sin embargo, fíjese también que,<br />

d<strong>en</strong>tro del método, la selección de esta estructura <strong>en</strong> particular también ha desaparecido!<br />

Así, <strong>en</strong> lugar de decir s->size = sz; ahora dice size = sz; eliminando<br />

el tedioso s-> que <strong>en</strong> realidad no aportaba nada al significado semántico de lo que<br />

estaba escribi<strong>en</strong>do. Apar<strong>en</strong>tem<strong>en</strong>te, el compilador de <strong>C++</strong> está realizando estas tareas<br />

por el programador. De hecho, está tomando el primer argum<strong>en</strong>to «secreto» (la<br />

dirección de la estructura que antes t<strong>en</strong>ía que pasar a mano) y aplicándole el selector<br />

de miembro (->) siempre que escribe el nombre de uno de los datos miembro. Eso<br />

significa que, siempre y cuando esté d<strong>en</strong>tro de la definición de una método de una<br />

estructura puede hacer refer<strong>en</strong>cia a cualquier otro miembro (incluy<strong>en</strong>do otro método)<br />

simplem<strong>en</strong>te dando su nombre. El compilador buscará primero <strong>en</strong> los nombres<br />

locales de la estructura antes de buscar <strong>en</strong> versiones más globales de dichos nombres.<br />

El lector podrá descubrir que esta característica no sólo agiliza la escritura del<br />

código, sino que también hace la lectura del mismo mucho más s<strong>en</strong>cilla.<br />

Pero qué pasaría si, por alguna razón, quisiera hacer refer<strong>en</strong>cia a la dirección de<br />

memoria de la estructura. En la versión <strong>en</strong> C de la librería ésta se podía obt<strong>en</strong>er<br />

fácilm<strong>en</strong>te del primer argum<strong>en</strong>to de cualquier función. En <strong>C++</strong> la cosa es más consist<strong>en</strong>te:<br />

existe la palabra reservada this que produce la dirección de la variable<br />

struct actual. Es el equival<strong>en</strong>te a la expresión s de la versión <strong>en</strong> C de la librería. De<br />

modo que, podremos volver al estilo de C escribi<strong>en</strong>do<br />

this->size = Size;<br />

El código g<strong>en</strong>erado por el compilador será exactam<strong>en</strong>te el mismo por lo que no<br />

es necesario usar this <strong>en</strong> estos casos. Ocasionalm<strong>en</strong>te, podrá ver por ahí código<br />

dónde la g<strong>en</strong>te usa this <strong>en</strong> todos sitios sin agregar nada al significado del código<br />

(esta práctica es indicio de programadores inexpertos). Por lo g<strong>en</strong>eral, this no se usa<br />

muy a m<strong>en</strong>udo pero, cuando se necesite siempre estará allí (<strong>en</strong> ejemplos posteriores<br />

del libro verá más sobre su uso).<br />

Queda aún un último tema que tocar. En C, se puede asignar un void * a cualquier<br />

otro puntero, algo como esto:<br />

int i = 10;<br />

void* vp = &i; // OK tanto <strong>en</strong> C como <strong>en</strong> <strong>C++</strong><br />

int* ip = vp; // óSlo aceptable <strong>en</strong> C<br />

153<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!