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 310 — #348<br />
✐<br />
Capítulo 11. Las refer<strong>en</strong>cias y el constructor de copia<br />
haber sido creado como valor de retorno de otra función o explícitam<strong>en</strong>te por el<br />
usuario de la función. Los objetos temporales son siempre constantes. Por eso, si no<br />
utiliza una refer<strong>en</strong>cia constante, el compilador se quejará. Como ejemplo muy simple:<br />
//: C11:ConstRefer<strong>en</strong>ceArgum<strong>en</strong>ts.cpp<br />
// Passing refer<strong>en</strong>ces as const<br />
void f(int&) {}<br />
void g(const int&) {}<br />
int main() {<br />
//! f(1); // Error<br />
g(1);<br />
} ///:~<br />
La llamada f(1) provoca un error <strong>en</strong> tiempo de compilación porque el compilador<br />
debe crear primero una refer<strong>en</strong>cia. Lo hace asignando memoria para un int,<br />
iniciánlizándolo a uno y g<strong>en</strong>erando la dirección de memoria para ligarla a la refer<strong>en</strong>cia.<br />
La memoria debe ser constante porque no t<strong>en</strong>dría s<strong>en</strong>tido cambiarlo: no<br />
puede cambiarse de nuevo. Puede hacer la misma suposición para todos los objetos<br />
temporales: son inaccesibles. Es importante que el compilador le diga cuándo está<br />
int<strong>en</strong>tando cambiar algo de este estilo porque podría perder información.<br />
Refer<strong>en</strong>cias a puntero<br />
En C, si desea modificar el cont<strong>en</strong>ido del puntero <strong>en</strong> sí <strong>en</strong> vez de modificar a lo<br />
que apunta, la declaración de la función sería:<br />
void f(int**);<br />
y t<strong>en</strong>dría que tomar la dirección del puntero cuando se llamara a la función:<br />
int i = 47;<br />
int* ip = &i;<br />
f(&ip);<br />
La sintaxis es más clara con las refer<strong>en</strong>cias <strong>en</strong> <strong>C++</strong>. El argum<strong>en</strong>to de la función<br />
pasa a ser de una refer<strong>en</strong>cia a un puntero, y así no ha de manejar la dirección del<br />
puntero.<br />
//: C11:Refer<strong>en</strong>ceToPointer.cpp<br />
#include <br />
using namespace std;<br />
void increm<strong>en</strong>t(int*& i) { i++; }<br />
int main() {<br />
int* i = 0;<br />
cout