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