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 257 — #295<br />
✐<br />
9.2. Funciones inline<br />
int x = A.read();<br />
} ///:~<br />
Aquí, el usuario de la clase nunca ti<strong>en</strong>e contacto directo con las variables de estado<br />
internas a la clase, y pued<strong>en</strong> mant<strong>en</strong>erse como privadas, bajo el control del<br />
diseñador de la clase. Todo el acceso a los atributos se puede controlar a través de<br />
los métodos de la interfaz. Además, el acceso es notablem<strong>en</strong>te efici<strong>en</strong>te. Considere<br />
read(), por ejemplo. Sin inline, el código g<strong>en</strong>erado para la llamada a read()<br />
podría incluir colocarla <strong>en</strong> la pila y ejecutar la llamada CALL de <strong>en</strong>samblador. En<br />
la mayoría de las arquitecturas, el tamaño de ese código sería mayor que el código<br />
creado para la variante inline, y el tiempo de ejecución sería mayor con toda certeza.<br />
Sin las funciones inline, un diseñador de clases preocupado por la efici<strong>en</strong>cia estaría<br />
t<strong>en</strong>tado de hacer que i fuese un atributo público, eliminado la sobrecarga y<br />
permiti<strong>en</strong>do al usuario acceder directam<strong>en</strong>te a i. Desde el punto de vista del diseñador,<br />
eso resulta desastroso, i sería parte de la interfaz pública, lo cual significa que<br />
el diseñador de la clase no podrá cambiarlo <strong>en</strong> el futuro. T<strong>en</strong>drá que cargar con un<br />
<strong>en</strong>tero llamado i. Esto es un problema porque después puede que considere mejor<br />
usar un float <strong>en</strong> lugar de un int para repres<strong>en</strong>tar el estado, pero como i es parte de<br />
la interfaz pública, no podrá cambiarlo. O puede que necesite realizar algún cálculo<br />
adicional como parte de la lectura o escritura de i, que no podrá hacer si es público.<br />
Si, por el contrario, siempre usa métodos para leer y cambiar la información de estado<br />
del objeto, podrá modificar la repres<strong>en</strong>tación subyac<strong>en</strong>te del objeto hasta estar<br />
totalm<strong>en</strong>te conv<strong>en</strong>cido.<br />
Además, el uso de métodos para controlar atributos le permite añadir código al<br />
método para detectar cuando cambia el valor, algo que puede ser muy útil durante<br />
la depuración. Si un atributo es público, cualquiera puede cambiarlo <strong>en</strong> cualquier<br />
mom<strong>en</strong>to sin que el programador lo sepa.<br />
Accesores y mutadores<br />
Hay g<strong>en</strong>te que divide el concepto de funciones de acceso <strong>en</strong> dos: accesores (para<br />
leer la información de estado de un objeto) y mutadores (para cambiar el estado de<br />
un objeto). Además, se puede utilizar la sobrecarga de funciones para t<strong>en</strong>er métodos<br />
accesores y mutadores con el mismo nombre; el modo <strong>en</strong> que se invoque el método<br />
determina si se lee o modifica la información de estado. Así,<br />
//: C09:Rectangle.cpp<br />
// Accessors & mutators<br />
class Rectangle {<br />
int wide, high;<br />
public:<br />
Rectangle(int w = 0, int h = 0)<br />
: wide(w), high(h) {}<br />
int width() const { return wide; } // Read<br />
void width(int w) { wide = w; } // Set<br />
int height() const { return high; } // Read<br />
void height(int h) { high = h; } // Set<br />
};<br />
int main() {<br />
Rectangle r(19, 47);<br />
// Change width & height:<br />
257<br />
✐<br />
✐<br />
✐<br />
✐