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 292 — #330<br />

✐<br />

Capítulo 10. Control de nombres<br />

//! static int i; // Error<br />

// (How would you define i)<br />

} x;<br />

}<br />

int main() { Outer x; f(); } ///:~<br />

Ya puede ver el problema con atributos estáticos <strong>en</strong> clases locales: ¿Cómo describirá<br />

el dato miembro <strong>en</strong> el ámbito del fichero para poder definirlo En la práctica, el<br />

uso de clases locales es muy poco común.<br />

10.3.3. Métodos estáticos<br />

También puede crear métodos estáticos que, como los atributos estáticos, trabajan<br />

para la clase como un todo <strong>en</strong> lugar de para un objeto particular de la clase. En lugar<br />

de hacer una función global que viva <strong>en</strong> y «contamine» el espacio de nombres global<br />

o local, puede incluir el método d<strong>en</strong>tro de la clase. Cuando crea un método estático,<br />

está expresando una asociación con una clase particular.<br />

Puede llamar a un miembro estáticos de la forma habitual, con el punto o la flecha,<br />

<strong>en</strong> asociación con un objeto. De todas formas, es más típico llamar a los métodos<br />

estáticos <strong>en</strong> si mismos, sin especificar ningún objeto, utilizando el operador de resolución<br />

de ámbito, como <strong>en</strong> el sigui<strong>en</strong>te ejemplo:<br />

//: C10:SimpleStaticMemberFunction.cpp<br />

class X {<br />

public:<br />

static void f(){};<br />

};<br />

int main() {<br />

X::f();<br />

} ///:~<br />

Cuando vea métodos estáticos <strong>en</strong> una clase, recuerde que el diseñador pret<strong>en</strong>día<br />

que esa función estuviese conceptualm<strong>en</strong>te asociada a la clase como un todo.<br />

Un método estático no puede acceder a los atributos ordinarios, sólo a los estáticos.<br />

Sólo puede llamar a otros métodos estáticos. Normalm<strong>en</strong>te, la dirección del<br />

objeto actual (this) se pasa de forma <strong>en</strong>cubierta cuando se llama a cualquier método,<br />

pero un miembro static no ti<strong>en</strong>e this, que es la razón por la cual no puede<br />

acceder a los miembros ordinarios. Por tanto, se obti<strong>en</strong>e el ligero increm<strong>en</strong>to de velocidad<br />

proporcionado por una función global debido a que un método estático no<br />

implica la carga extra de t<strong>en</strong>er que pasar this. Al mismo tiempo, obti<strong>en</strong>e los b<strong>en</strong>eficios<br />

de t<strong>en</strong>er la función d<strong>en</strong>tro de la clase.<br />

Para atributos, static indica que sólo existe un espacio de memoria por atributo<br />

para todos los objetos de la clase. Esto establece que el uso de static para definir<br />

objetos d<strong>en</strong>tro de una función significa que sólo se utiliza una copia de una variable<br />

local para todas las llamadas a esa función.<br />

Aquí aparece un ejemplo mostrando atributos y métodos estáticos utilizados conjuntam<strong>en</strong>te:<br />

292<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!