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

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

Saved successfully!

Ooh no, something went wrong!