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 230 — #268<br />

✐<br />

Capítulo 8. Constantes<br />

modificar la variable a través del puntero. Por supuesto, siempre puede usar «un<br />

molde» para forzar la asignación, pero eso es siempre una mala práctica de programación<br />

ya que rompe la consist<strong>en</strong>cia de la variable además del grado de seguridad<br />

que ofrece el especificador const. Por ejemplo:<br />

//: C08:PointerAssignm<strong>en</strong>t.cpp<br />

int d = 1;<br />

const int e = 2;<br />

int* u = &d; // OK -- d not const<br />

//! int* v = &e; // Illegal -- e const<br />

int* w = (int*)&e; // Legal but bad practice<br />

int main() {} ///:~<br />

Aunque <strong>C++</strong> ayuda a evitar errores, no le protege de usted mismo si se empeña<br />

<strong>en</strong> romper los mecanismos de seguridad.<br />

Literales de cad<strong>en</strong>a<br />

<strong>C++</strong> no es tan estricto con los literales <strong>en</strong> lo refer<strong>en</strong>te a constantes. Puede escribir:<br />

char * cp = "howdy";<br />

y el compilador lo aceptará sin objeción. Técnicam<strong>en</strong>te esto supone un error porque<br />

el literal de cad<strong>en</strong>a («howdy» <strong>en</strong> este caso) se crea por el compilador como un<br />

vector de caracteres constante, y el resultado del vector de caracteres <strong>en</strong>trecomillado<br />

es la dirección de memoria del primer elem<strong>en</strong>to. Si se modifica uno de los caracteres<br />

del vector <strong>en</strong> tiempo de ejecución es un error, aunque no todos los compiladores lo<br />

impon<strong>en</strong> correctam<strong>en</strong>te.<br />

Así que los literales de cad<strong>en</strong>a son arrays de caracteres constantes. Por supuesto,<br />

el compilador le permite tratarlos como no constantes porque existe mucho código<br />

C que dep<strong>en</strong>de de ello. De todas formas, si int<strong>en</strong>ta cambiar los valores de un literal,<br />

el resultado no está definido, y probablem<strong>en</strong>te funcione <strong>en</strong> muchos computadores.<br />

Si quiere poder modificar una cad<strong>en</strong>a, debe ponerla <strong>en</strong> un vector:<br />

char cp[] = "howdy";<br />

Como los compiladores a m<strong>en</strong>udo no impon<strong>en</strong> la difer<strong>en</strong>cia no ti<strong>en</strong>e porqué recordar<br />

que debe usar esta la última forma y la cuestión pasa a ser algo bastante sutil.<br />

8.3. Argum<strong>en</strong>tos de funciones y valores de retorno<br />

230<br />

El uso del especificador const con argum<strong>en</strong>tos de funciones y valores de retorno<br />

es otro lugar donde el concepto de constante puede resultar confuso. Si está pasando<br />

variables por valor, utilizar const no ti<strong>en</strong>e significado para el cli<strong>en</strong>te (significa que el<br />

argum<strong>en</strong>to que se pasa no puede modificarse <strong>en</strong> la función). Si está devolvi<strong>en</strong>do una<br />

variable de un tipo derivado y utiliza el especificador const, significa que el valor<br />

de retorno no puede modificarse. Si pasa o devuelve direcciones, const impide que<br />

el destinatario de la dirección pueda modificarse.<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!