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 277 — #315<br />
✐<br />
10.1. Los elem<strong>en</strong>tos estáticos de C<br />
do, el compilador garantiza que la variable se inicializará a cero (convertido al tipo<br />
adecuado) al com<strong>en</strong>zar el programa. Así pues, <strong>en</strong> oneChar(), la primera vez que<br />
se llama a la función, s vale cero. En este caso, se cumplirá la condición if(!s).<br />
La inicialización anterior para s es muy simple, pero la inicialización para objetos<br />
estáticos (como la de cualquier otro objeto) puede ser una expresión arbitraria, que<br />
involucre constantes, variables o funciones previam<strong>en</strong>te declaradas.<br />
Fíjese que la función de arriba es muy vulnerable a problemas de concurr<strong>en</strong>cia.<br />
Siempre que diseñe funciones que cont<strong>en</strong>gan variables estáticas, deberá t<strong>en</strong>er <strong>en</strong><br />
m<strong>en</strong>te este tipo de problemas.<br />
Objetos estáticos d<strong>en</strong>tro de funciones<br />
Las reglas son las mismas para objetos estáticos de tipos definidos por el usuario,<br />
añadi<strong>en</strong>do el hecho que el objeto requiere ser inicializado. Sin embargo, la asignación<br />
del valor cero sólo ti<strong>en</strong>e s<strong>en</strong>tido para tipos predefinidos. Los tipos definidos por el<br />
usuario deb<strong>en</strong> ser inicializados llamando a sus respectivos constructores. Por tanto,<br />
si no especifica argum<strong>en</strong>tos <strong>en</strong> los constructores cuando defina un objeto estático, la<br />
clase deberá t<strong>en</strong>er un constructor por defecto. Por ejemplo:<br />
//: C10:StaticObjectsInFunctions.cpp<br />
#include <br />
using namespace std;<br />
class X {<br />
int i;<br />
public:<br />
X(int ii = 0) : i(ii) {} // Default<br />
~X() { cout