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

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

Saved successfully!

Ooh no, something went wrong!