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

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

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

Saved successfully!

Ooh no, something went wrong!