Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 86 — #124<br />
✐<br />
Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />
double d;<br />
// The address of ANY type can be<br />
// assigned to a void pointer:<br />
vp = &c;<br />
vp = &i;<br />
vp = &f;<br />
vp = &d;<br />
} ///:~<br />
Una vez que se asigna a un void* se pierde cualquier información sobre el tipo<br />
de la variables. Esto significa que antes de que se pueda utilizar el puntero, se debe<br />
moldear al tipo correcto:<br />
//: C03:CastFromVoidPointer.cpp<br />
int main() {<br />
int i = 99;<br />
void* vp = &i;<br />
// Can’t derefer<strong>en</strong>ce a void pointer:<br />
// *vp = 3; // Compile-time error<br />
// Must cast back to int before derefer<strong>en</strong>cing:<br />
*((int*)vp) = 3;<br />
} ///:~<br />
El molde (int*)vp toma el void* y le dice al compilador que lo trate como un<br />
int*, y de ese modo se puede derefer<strong>en</strong>ciar correctam<strong>en</strong>te. Puede observar que esta<br />
sintaxis es horrible, y lo es, pero es peor que eso - el void* introduce un agujero <strong>en</strong><br />
el sistema de tipos del l<strong>en</strong>guaje. Eso significa, que permite, o incluso promueve, el<br />
tratami<strong>en</strong>to de un tipo como si fuera otro tipo. En el ejemplo anterior, se trata un int<br />
como un int mediante el moldeado de vp a int*, pero no hay nada que indique que no<br />
se lo puede moldear a char* o double*, lo que modificaría una cantidad difer<strong>en</strong>te de<br />
espacio que ha sido asignada al int, lo que posiblem<strong>en</strong>te provocará que el programa<br />
falle.. En g<strong>en</strong>eral, los punteros void deberían ser evitados, y utilizados únicam<strong>en</strong>te<br />
<strong>en</strong> raras ocasiones, que no se podrán considerar hasta bastante más adelante <strong>en</strong> el<br />
libro.<br />
No se puede t<strong>en</strong>er una refer<strong>en</strong>cia void, por razones que se explicarán <strong>en</strong> el capítulo<br />
11.<br />
86<br />
3.5. Alcance<br />
Las reglas de ámbitos dic<strong>en</strong> cuando es válida una variable, dónde se crea, y cuándo<br />
se destruye (es decir, sale de ámbito). El ámbito de una variable se exti<strong>en</strong>de desde<br />
el punto donde se define hasta la primera llave que empareja con la llave de apertura<br />
antes de que la variable fuese definida. Eso quiere decir que un ámbito se define por<br />
su juego de llaves «más cercanas». Para ilustrarlo:<br />
//: C03:Scope.cpp<br />
// How variables are scoped<br />
int main() {<br />
int scp1;<br />
// scp1 visible here<br />
{<br />
✐<br />
✐<br />
✐<br />
✐