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

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

Saved successfully!

Ooh no, something went wrong!