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

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

Saved successfully!

Ooh no, something went wrong!