References y Pointers
Una reference, escrita con &, es un alias de una variable existente — una vez vinculada, nunca puede reasignarse para referirse a otra cosa. Pasar una reference a una función le permite a esa función modificar la variable original, sin el costo de copiarla.
#include <iostream>
using namespace std;
void addOne(int& n) {
n = n + 1;
}
int main() {
int x = 5;
addOne(x);
cout << "x = " << x << endl;
return 0;
}x = 6
Pointers
Un pointer, escrito con *, contiene la dirección de memoria de un valor en vez de aliasarlo directamente. A diferencia de una reference, un pointer puede reasignarse para apuntar a otro lugar completamente distinto, y puede ser null (nullptr) para indicar que 'no apunta a nada'. & toma una dirección, * desreferencia un pointer para obtener el valor al que apunta.
#include <iostream>
using namespace std;
int main() {
int x = 10;
int* p = &x;
cout << "value = " << *p << endl;
*p = 20;
cout << "x = " << x << endl;
return 0;
}value = 10 x = 20
Cómo se ve un error real de const-correctness
A diferencia de Rust, C++ no tiene un borrow checker que rastree quién puede leer o escribir un valor en un momento dado — pero sí hace cumplir la const-correctness: una función que recibe una const reference promete no modificar aquello a lo que se refiere, y el compilador la obliga a cumplir esa promesa. Esto es genuinamente lo que reporta g++ cuando esa promesa se rompe — capturado de una ejecución real, no escrito para parecer plausible:
#include <iostream>
using namespace std;
void tryToModify(const int& n) {
n = 100;
}
int main() {
int x = 5;
tryToModify(x);
cout << x << endl;
return 0;
}main.cpp: In function ‘void tryToModify(const int&)’:
main.cpp:5:7: error: assignment of read-only reference ‘n’
5 | n = 100;
| ~~^~~~~Nada se ejecuta en absoluto — no hay resultado, solo el error. La const-correctness es una de las pocas garantías en tiempo de compilación que C++ te da gratis; todo lo demás sobre seguridad de memoria aquí es convención, no imposición.
Siguiente: funciones y overloading — parámetros, argumentos por defecto, y polimorfismo en tiempo de compilación mediante function overloading.
Practice exercise
Escribe una función doubleIt(int& n) que duplique n in place a través de la reference. Llámala con x = 21, luego imprime x.