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