Las referencias Una referencia es otra forma de acceder a un dato, una especie de alias. Cualquier operacion sobre una referencia afectara a ese dato al que hace referencia.
Figura: sin duda los punteros y las referencias fueron obra de los sarracenos.
Veamos un ejemplo simple:
| /**
* Referencias.cpp
* Programa que muestra el uso de referencias
* 
* Pello Xabier Altadill Izura 
*
* Compilado: g++ Referencias.cpp -o Referencias
*/
using namespace std;
#include <iostream>
int main() {
	// Definimos un dato y su referencia
	int numero;
	int &referenciaNumero = numero; // Ahi se crea la referencia
	
	cout << "Vamos a ver que pasa si le asignamos un dato: " << endl;
	numero = 31337;
	
	// Los dos mostraran el mismo valor
	cout << "Valor de numero: " << numero << endl;
	cout << "Valor de referenciaNumero: " << referenciaNumero << endl;
	
	// y a donde apuntan? AL MISMO SITIO
	cout << "Posicion de numero: " << &numero << endl;
	cout << "Posicion de referenciaNumero: " << &referenciaNumero << endl;
	cout << "Programa terminado \n" << endl;
	
	return 0;
} | 
| /**
* ReferenciaFunciones.cpp
* Programa que muestra el uso de referencias en las funciones
* 
* Pello Xabier Altadill Izura 
*
* Compilado: g++ ReferenciaFunciones.cpp -o ReferenciaFunciones
*/
using namespace std;
#include <iostream>
// 1º funcion que intercambia dos valores
void exchange (int *refa, int *refb);
// 2º funcion -sobrecargada- que intercambia dos valores
void exchange (int &refa, int &refb);
int main() {
	
	// Definimos un dato y su referencia
	int a, b;
	
	cout << "Asignamos valores: " << endl;
	a = 45;
	b = 21;
	
	cout << "Valores: a=" << a << " b=" << b << endl;
	cout << "Hacemos intercambio con exchange(int *refa, int *refb): " << endl;
	exchange(&a, &b); // Con esta llamada invocamos la primera funcion!!
	
	cout << "Valores: a=" << a << " b=" << b << endl;
	cout << "Hacemos intercambio con exchange(int &refa, int &refb): " << endl;
	xchange(a, b); // Con esta llamada invocamos la segunda funcion!!
	
	out << "Valores: a=" << a << " b=" << b << endl;
	out << "Programa terminado \n" << endl;
	return 0;
}
// 1º funcion que intercambia dos valores
void exchange (int *refa, int *refb) {
	int tmp;
	tmp = *refa;
	*refa = *refb;
	*refa = tmp; 
}
// 2º funcion -sobrecargada- que intercambia dos valores
void exchange (int &refa, int &refb) {
	
	int tmp;
	
	tmp = refa;
	refa = refb;
	refa = tmp;
}
 | 
| /**
* Gremlin.hpp
*
* Clase que representa el objeto Gremlin.
* Observese el 3º metodo constructor
* Pello Xabier Altadill Izura 
*
*/
using namespace std;
#include <iostream>
class Gremlin {
public:
	Gremlin();
	Gremlin(char *nmb,int ed, int p);
	
	Gremlin(Gremlin&); // atencion a este constructor
	
	~Gremlin();
	void correr();
	void dormir();
	void morder();
	int peso;
private:
	
	char *nombre;
	
	int edad;
}; | 
| /**
* Gremlin.cpp
*
* Clase que implementa el objeto Gremlin.
* Pello Xabier Altadill Izura 
*
*/
#include "Gremlin.hpp"
Gremlin::Gremlin() {
	peso = 1;
	cout << "Gremlin creado." << endl;
}
Gremlin::Gremlin (char *nmb,int ed, int p) {
	
	nombre = nmb;
	edad = ed;
	peso = p;
}
Gremlin::~Gremlin() {
	
	cout << "Aaaargh!\nGremlin destruido." << endl;
}
// El gremlin corre
void correr() {
	
	cout << "Jaja grrrr!! jajaja!" << endl;
}
// El gremlin duerme
void dormir() {
	cout << "zzzZZZZzzzzz" << endl;
}
// El gremlin muerde
void morder() {
	cout << "roaar ñam ñam" << endl; 
}
// Definimos esta funcion aparte de la clase
// Con ella el gremlin come y aumenta su atributo peso.
void comer (Gremlin *g) {
	// Invocamos la mordedura para que coma
	g->morder();
	// Le aumentamos 3 unidades por comer
	g->peso += 3;
}
// Funcion main
int main () {
	cout << "Iniciando programa. " << endl;
	
	// Definimos un gremlin
	Gremlin tbautista;
	// y lo movemos por la ciudad
	tbautista.correr();
	tbautista.morder();
	// Mostramos su peso
	cout << "El gremlin pesa: " << tbautista.peso << endl;
	// Le hacemos comer:
	comer(&tbautista);
	// Mostramos su peso otra vez
	cout << "El gremlin pesa ahora: " << tbautista.peso << endl;
	cout << "Finalizando programa\n " << endl;
	return 0;
} | 
| /**
* Gremlin2.hpp
*
* Clase que representa el objeto Gremlin.
* Con un metodo definido como const!!
* Pello Xabier Altadill Izura 
*
*/
using namespace std;
#include <iostream>
class Gremlin {
public:
	Gremlin();
	Gremlin(char *nmb,int ed, int p);
	Gremlin(Gremlin&); // atencion a este constructor
	~Gremlin();
	void correr();
	void dormir();
	void morder();
	// Definimos una funcion constante
	char * getNombre() const;
	int peso;
private:
	
	char *nombre;
	
	int edad;
}; | 
| /**
* Gremlin2.cpp
*
* Clase que implementa el objeto Gremlin.
* Pello Xabier Altadill Izura 
*
*/
#include "Gremlin2.hpp"
Gremlin::Gremlin() {
	
	peso = 1;
	
	cout << "Gremlin creado." << endl;
}
Gremlin::Gremlin (char *nmb,int ed, int p) {
	
		nombre = nmb;
		edad = ed;
		peso = p;
}
Gremlin::~Gremlin() {
	
	cout << "Aaaargh!\nGremlin destruido." << endl;
}
// El gremlin corre
void correr() {
	
	cout << "Jaja grrrr!! jajaja!" << endl;
}
// El gremlin duerme
void dormir() {
	
	cout << "zzzZZZZzzzzz" << endl;
}
// El gremlin muerde
void morder() {
	
		cout << "roaar ñam ñam" << endl; 
}
// FUNCION CONST!!!
// Devuelve el nombre del gremlin
char * getNombre() const {
		return nombre;
}
// Definimos esta funcion aparte de la clase
// Con ella el gremlin come y aumenta su atributo peso.
void comer (const Gremlin const *g) {
	// Invocamos la mordedura para que coma??
	// g->morder(); ERROR no podemos invocar una funcion NO CONSTANTE!!!
	// en cambio si podemos invocar getNombre
	cout << "Nombre" << g->getNombre() << endl; 
}
// Funcion main
int main () {
	cout << "Iniciando programa. " << endl;
	// Definimos un gremlin
	Gremlin tbautista;
	
	// y lo movemos por la ciudad
	tbautista.correr();
	tbautista.morder();
	
	// Mostramos su peso
	cout << "El gremlin pesa: " << tbautista.peso << endl;
	// Le hacemos comer:
	comer(&tbautista);
	
	// Mostramos su peso otra vez
	cout << "El gremlin pesa ahora: " << tbautista.peso << endl;
	cout << "Finalizando programa\n " << endl;
	return 0;
} |