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 237 — #275<br />

✐<br />

8.4. Clases<br />

complejidad de una clase. Para garantizar dicha consist<strong>en</strong>cia se emplean las funciones<br />

miembro constantes; que son las únicas que un objeto constante puede invocar.<br />

8.4.1. const <strong>en</strong> las clases<br />

Uno de los lugares donde interesa usar const es para expresiones constantes<br />

d<strong>en</strong>tro de las clases. El ejemplo típico es cuando se define un vector <strong>en</strong> una clase y<br />

se quiere usar const <strong>en</strong> lugar de #define para establecer el tamaño del vector y<br />

para usarlo al calcular datos concerni<strong>en</strong>tes al vector. El tamaño del vector es algo<br />

que desea mant<strong>en</strong>er oculto <strong>en</strong> la clase, así que si usa un nombre como size, por<br />

ejemplo, se podría usar el mismo nombre <strong>en</strong> otra clase sin que ocurra un conflicto. El<br />

preprocesador trata todos los #define de forma global a partir del punto donde se<br />

defin<strong>en</strong>, algo que const permite corregir de forma adecuada consigui<strong>en</strong>do el efecto<br />

deseado.<br />

Se podría p<strong>en</strong>sar que la elección lógica es colocar una constante d<strong>en</strong>tro de la<br />

clase. Esto no produce el resultado esperado. D<strong>en</strong>tro de una clase const recupera<br />

un poco su significado <strong>en</strong> C. Asigna espacio de almac<strong>en</strong>ami<strong>en</strong>to para cada variable<br />

y repres<strong>en</strong>ta un valor que es inicializado y ya no se puede cambiar. El uso de una<br />

constante d<strong>en</strong>tro de una clase significa «Esto es constante durante la vida del objeto».<br />

Por otra parte, <strong>en</strong> cada objeto la constante puede cont<strong>en</strong>er un valor difer<strong>en</strong>te.<br />

Por eso, cuando crea una constante ordinaria (no estática) d<strong>en</strong>tro de una clase, no<br />

puede darle un valor inicial. Esta inicialización debe ocurrir <strong>en</strong> el constructor. Como<br />

la constante se debe inicializar <strong>en</strong> el punto <strong>en</strong> que se crea, <strong>en</strong> el cuerpo del constructor<br />

la constante debe estar ya inicializada. De otro modo, le quedaría la opción<br />

de esperar hasta algún punto posterior <strong>en</strong> el constructor, lo que significaría que la<br />

constante no t<strong>en</strong>dría valor por un mom<strong>en</strong>to. Y nada impediría cambiar el valor de la<br />

constante <strong>en</strong> varios sitios del constructor.<br />

La lista de inicialización del constructor.<br />

Un punto especial de inicialización es la llamada «lista de inicialización del constructor»<br />

y fue p<strong>en</strong>sada <strong>en</strong> un principio para su uso <strong>en</strong> her<strong>en</strong>cia (tratada <strong>en</strong> el [FIX-<br />

ME:XREF:capítulo 14]). La lista de inicialización del constructor (que como su nombre<br />

indica, sólo aparece <strong>en</strong> la definición del constructor) es una lista de llamadas a<br />

constructores que aparece después de la lista de argum<strong>en</strong>tos del constructor y antes<br />

de abrir la llave del cuerpo del constructor. Se hace así para recordarle que las inicialización<br />

de la lista sucede antes de ejecutarse el constructor. Ese es el lugar donde<br />

poner las inicializaciones de todas las constantes de la clase. El modo apropiado para<br />

colocar las constantes <strong>en</strong> una clase se muestra a continuación:<br />

//: C08:ConstInitialization.cpp<br />

// Initializing const in classes<br />

#include <br />

using namespace std;<br />

class Fred {<br />

const int size;<br />

public:<br />

Fred(int sz);<br />

void print();<br />

};<br />

Fred::Fred(int sz) : size(sz) {}<br />

237<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!