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