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 178 — #216<br />
✐<br />
Capítulo 5. Ocultar la implem<strong>en</strong>tación<br />
que todo el mundo pueda ver que esa es una de las funciones privilegiadas.<br />
<strong>C++</strong> es un l<strong>en</strong>guaje ori<strong>en</strong>tado a objetos híbrido, no es puro, y fri<strong>en</strong>d fue añadido<br />
para solucionar algunos problemas que se pres<strong>en</strong>taban <strong>en</strong> la práctica. Es bu<strong>en</strong>o<br />
apuntar que esto hace al l<strong>en</strong>guaje m<strong>en</strong>os «puro», pues <strong>C++</strong> fue diseñado para ser<br />
pragmático, no para aspirar a un ideal abstracto.<br />
5.4. Capa de objetos<br />
En el capítulo 4 se dijo que una struct escrita para un compilador C y más tarde<br />
compilada <strong>en</strong> uno de <strong>C++</strong> no cambiaría. Se refería básicam<strong>en</strong>te a la estructura interna<br />
del objeto que surge de la struct, es decir, la posición relativa <strong>en</strong> memoria donde se<br />
guardan los valores de las difer<strong>en</strong>tes variables. Si el compilador <strong>C++</strong> cambiase esta<br />
estructura interna, <strong>en</strong>tonces el código escrito <strong>en</strong> C que hiciese uso del conocimi<strong>en</strong>to<br />
de las posiciones de las variables fallaría.<br />
Cuando se empiezan a usar los especificadores de acceso, se cambia al universo<br />
del <strong>C++</strong>, y las cosas cambian un poco. D<strong>en</strong>tro de un «bloque de acceso» (un grupo<br />
de declaraciones delimitado por especificadores de acceso), se garantiza que las<br />
variables se <strong>en</strong>contraran contiguas, como <strong>en</strong> C. Sin embargo, los bloques de acceso<br />
pued<strong>en</strong> no aparecer <strong>en</strong> el objeto <strong>en</strong> el mismo ord<strong>en</strong> <strong>en</strong> que se declaran. Aunque el<br />
compilador normalm<strong>en</strong>te colocará los bloques como los definió, no hay reglas sobre<br />
esto, pues una arquitectura hardware especifica y/o un sistema operativo puede<br />
t<strong>en</strong>er soporte especifico para private y protected que puede requerir que estos<br />
bloques se coloqu<strong>en</strong> <strong>en</strong> lugares específicos de la memoria. La especificación del<br />
l<strong>en</strong>guaje no quiere impedir este tipo de v<strong>en</strong>tajas.<br />
Los especificadores de acceso son parte de la estructura y no afectan a los objetos<br />
creados desde ésta. Toda la información de accesos desaparece antes de que<br />
el programa se ejecute; <strong>en</strong> g<strong>en</strong>eral ocurre durante la compilación. En un programa<br />
<strong>en</strong> ejecución, los objetos son «zonas de almac<strong>en</strong>ami<strong>en</strong>to» y nada más. Si realm<strong>en</strong>te<br />
quiere, puede romper todas las reglas y acceder a la memoria directam<strong>en</strong>te, como <strong>en</strong><br />
C. <strong>C++</strong> no está diseñado para prohibir hacer cosas salvajes. Solo le proporciona una<br />
alternativa mucho más fácil, y deseable.<br />
En g<strong>en</strong>eral, no es una bu<strong>en</strong>a idea hacer uso de nada que dep<strong>en</strong>da de la implem<strong>en</strong>tación<br />
cuando se escribe un programa. Cuando necesite hacerlo, <strong>en</strong>capsúlelo <strong>en</strong><br />
una estructura, así <strong>en</strong> caso de t<strong>en</strong>er que portarlo se podrá conc<strong>en</strong>trar <strong>en</strong> ella.<br />
5.5. La clase<br />
El control de acceso se suele llamar también ocultación de la implem<strong>en</strong>tación. Incluir<br />
funciones d<strong>en</strong>tro de las estructuras (a m<strong>en</strong>udo llamado <strong>en</strong>capsulación 1 ) produce tipos<br />
de dato con características y comportami<strong>en</strong>to, pero el control de acceso pone<br />
fronteras <strong>en</strong> esos tipos, por dos razones importantes. La primera es para establecer<br />
lo que el programador cli<strong>en</strong>te puede y no puede hacer. Puede construir los mecanismos<br />
internos de la estructura sin preocuparse de que el programador cli<strong>en</strong>te pueda<br />
p<strong>en</strong>sar que son parte de la interfaz que debe usar.<br />
Esto nos lleva directam<strong>en</strong>te a la segunda razón, que es separar la interfaz de la<br />
implem<strong>en</strong>tación. Si la estructura se usa <strong>en</strong> una serie de programas, y el programador<br />
cli<strong>en</strong>te no puede hacer más que mandar m<strong>en</strong>sajes a la interfaz pública, usted puede<br />
cambiar cualquier cosa privada sin que se deba modificar código cli<strong>en</strong>te.<br />
1 Como se dijo anteriorm<strong>en</strong>te, a veces el control de acceso se llama también <strong>en</strong>capsulación<br />
178<br />
✐<br />
✐<br />
✐<br />
✐