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 242 — #280<br />
✐<br />
Capítulo 8. Constantes<br />
const int i = 1;<br />
const blob b(2);<br />
Aquí, b es un objeto constante de tipo blob, su constructor se llama con un 2 como<br />
argum<strong>en</strong>to. Para que el compilador imponga que el objeto sea constante, debe<br />
asegurar que el objeto no ti<strong>en</strong>e atributos que vayan a cambiar durante el tiempo de<br />
vida del objeto. Puede asegurar fácilm<strong>en</strong>te que los atributos no públicos no sean modificables,<br />
pero. ¿Cómo puede saber que métodos cambiarán los atributos y cuáles<br />
son seguros para un objeto constante<br />
Si declara un método como constante, le está dici<strong>en</strong>do que la función puede ser<br />
invocada por un objeto constante. Un método que no se declara constante se trata<br />
como uno que puede modificar los atributos del objeto, y el compilador no permitirá<br />
que un objeto constante lo utilice.<br />
Pero la cosa no acaba ahí. Sólo porque un método afirme ser const no garantiza<br />
que actuará del modo correcto, de modo que el compilador fuerza que <strong>en</strong> la definición<br />
del método se reitere el especificador const (la palabra const se convierte<br />
<strong>en</strong> parte del nombre de la función, así que tanto el compilador como el <strong>en</strong>lazador<br />
comprobarán que no se viole la constancia). De este modo, si durante la definición<br />
de la función se modifica algún miembro o se llama algún método no constante, el<br />
compilador emitirá un m<strong>en</strong>saje de error. Por eso, está garantizado que los miembros<br />
que declare const se comportarán del modo esperado.<br />
Para compr<strong>en</strong>der la sintaxis para declarar métodos constantes, primero debe recordar<br />
que colocar const delante de la declaración del método indica que el valor<br />
de retorno es constante, así que no produce el efecto deseado. Lo que hay que hacer<br />
es colocar el especificador const después de la lista de argum<strong>en</strong>tos. Por ejemplo:<br />
//: C08:ConstMember.cpp<br />
class X {<br />
int i;<br />
public:<br />
X(int ii);<br />
int f() const;<br />
};<br />
X::X(int ii) : i(ii) {}<br />
int X::f() const { return i; }<br />
int main() {<br />
X x1(10);<br />
const X x2(20);<br />
x1.f();<br />
x2.f();<br />
} ///:~<br />
La palabra const debe incluirse tanto <strong>en</strong> la declaración como <strong>en</strong> la definición del<br />
método o de otro modo el compilador asumirá que es un método difer<strong>en</strong>te. Como<br />
f() es un método constante, si int<strong>en</strong>ta modificar i de alguna forma o llamar a otro<br />
método que no sea constante, el compilador informará de un error.<br />
Puede ver que un miembro constante puede llamarse tanto desde objetos constantes<br />
como desde no constantes de forma segura. Por ello, debe saber que esa es la<br />
forma más g<strong>en</strong>eral para un método (a causa de esto, el hecho de que los métodos<br />
242<br />
✐<br />
✐<br />
✐<br />
✐