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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 276 — #314<br />

✐<br />

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

No obstante, a veces es deseable ret<strong>en</strong>er un valor <strong>en</strong>tre llamadas a función. Esto<br />

se puede lograr creando una variable global, pero <strong>en</strong>tonces esta variable no estará<br />

únicam<strong>en</strong>te bajo control de la función. C y <strong>C++</strong> permit<strong>en</strong> crear un objeto static<br />

d<strong>en</strong>tro de una función. El almac<strong>en</strong>ami<strong>en</strong>to de este objeto no se lleva a cabo <strong>en</strong> la<br />

pila sino <strong>en</strong> el área de datos estáticos del programa. Dicho objeto sólo se inicializa<br />

una vez, la primera vez que se llama a la función, y reti<strong>en</strong>e su valor <strong>en</strong>tre difer<strong>en</strong>tes<br />

invocaciones. Por ejemplo, la sigui<strong>en</strong>te función devuelve el sigui<strong>en</strong>te carácter del<br />

vector cada vez que se la llama:<br />

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

#include "../require.h"<br />

#include <br />

using namespace std;<br />

char oneChar(const char* charArray = 0) {<br />

static const char* s;<br />

if(charArray) {<br />

s = charArray;<br />

return *s;<br />

}<br />

else<br />

require(s, "un-initialized s");<br />

if(*s == ’\0’)<br />

return 0;<br />

return *s++;<br />

}<br />

char* a = "abcdefghijklmnopqrstuvwxyz";<br />

int main() {<br />

// oneChar(); // require() fails<br />

oneChar(a); // Initializes s to a<br />

char c;<br />

while((c = oneChar()) != 0)<br />

cout

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

Saved successfully!

Ooh no, something went wrong!