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 309 — #347<br />

✐<br />

11.2. Refer<strong>en</strong>cias <strong>en</strong> <strong>C++</strong><br />

mismo pasando un puntero como argum<strong>en</strong>to, pero una refer<strong>en</strong>cia es sintácticam<strong>en</strong>te<br />

más clara. (Si lo desea, puede p<strong>en</strong>sar que una refer<strong>en</strong>cia es, nada más y nada m<strong>en</strong>os,<br />

más conv<strong>en</strong>i<strong>en</strong>te sintácticam<strong>en</strong>te).<br />

Si una función retorna una refer<strong>en</strong>cia, ha de t<strong>en</strong>er el mismo cuidado que si la<br />

función retornara un puntero. La refer<strong>en</strong>cia que se devuelva debe estar ligada a algo<br />

que no sea liberado cuando la función retorne. Si no, la refer<strong>en</strong>cia se referirá a un<br />

trozo de memoria sobre el que ya no ti<strong>en</strong>e control.<br />

He aquí un ejemplo:<br />

//: C11:Refer<strong>en</strong>ce.cpp<br />

// Simple <strong>C++</strong> refer<strong>en</strong>ces<br />

int* f(int* x) {<br />

(*x)++;<br />

return x; // Safe, x is outside this scope<br />

}<br />

int& g(int& x) {<br />

x++; // Same effect as in f()<br />

return x; // Safe, outside this scope<br />

}<br />

int& h() {<br />

int q;<br />

//! return q; // Error<br />

static int x;<br />

return x; // Safe, x lives outside this scope<br />

}<br />

int main() {<br />

int a = 0;<br />

f(&a); // Ugly (but explicit)<br />

g(a); // Clean (but hidd<strong>en</strong>)<br />

} ///:~<br />

La llamada a f() no ti<strong>en</strong>e la v<strong>en</strong>taja ni la claridad que la utilización de refer<strong>en</strong>cias,<br />

pero está claro que se está pasando una dirección mediante un puntero. En la<br />

llamada a g(), también se pasa una dirección (mediante una refer<strong>en</strong>cia), pero no se<br />

ve.<br />

Refer<strong>en</strong>cias constantes<br />

El argum<strong>en</strong>to refer<strong>en</strong>cia <strong>en</strong> Refer<strong>en</strong>ce.cpp funciona solam<strong>en</strong>te <strong>en</strong> caso de que<br />

el argum<strong>en</strong>to no sea un objeto constante. Si fuera un objeto constante, la función g()<br />

no aceptaría el argum<strong>en</strong>to, lo cual es positivo porque la función modificaría el argum<strong>en</strong>to<br />

que está fuera de la función. Si sabe que la función respetará las constancia un<br />

objeto, el hecho de que el argum<strong>en</strong>to sea una refer<strong>en</strong>cia constante permitirá que la<br />

función se pueda utilizar <strong>en</strong> cualquier situación. Esto significa que para tipos predefinidos,<br />

la función no modificará el argum<strong>en</strong>to, y para tipos definidos por el usuario,<br />

la función llamará solam<strong>en</strong>te a métodos constantes, y no modificara ningún atributo<br />

público.<br />

La utilización de refer<strong>en</strong>cias constantes <strong>en</strong> argum<strong>en</strong>tos de funciones es especialm<strong>en</strong>te<br />

importante porque una función puede recibir un objeto temporal. Éste podría<br />

309<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!