Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐