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

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

Saved successfully!

Ooh no, something went wrong!