Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐