References e Pointers
Uma reference, escrita com &, é um alias para uma variável existente — uma vez vinculada, ela nunca pode ser reatribuída para se referir a outra coisa. Passar uma reference para uma function permite que essa function modifique a variável original, sem o custo de copiá-la.
#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
Um pointer, escrito com *, guarda o endereço de memória de um valor em vez de fazer alias diretamente. Diferente de uma reference, um pointer pode ser reatribuído para apontar para outro lugar completamente diferente, e pode ser null (nullptr) para significar 'não aponta para nada'. & pega um endereço, * desreferencia um pointer para obter o valor para o qual ele aponta.
#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
Como é um erro real de const-correctness
Diferente do Rust, C++ não tem um borrow checker rastreando quem pode ler ou escrever um valor em um dado momento — mas ele impõe const-correctness: uma function que recebe uma const reference promete não modificar aquilo a que se refere, e o compilador a obriga a cumprir essa promessa. Isso é genuinamente o que o g++ relata quando essa promessa é quebrada — capturado de uma execução real, não escrito para parecer plausível:
#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 roda — nenhum resultado, só o erro. const-correctness é uma das poucas garantias em tempo de compilação que o C++ te dá de graça; tudo mais sobre segurança de memória aqui é convenção, não imposição.
A seguir: functions e overloading — parâmetros, argumentos padrão, e polimorfismo em tempo de compilação através de function overloading.
Practice exercise
Escreva uma function doubleIt(int& n) que dobre n in place através da reference. Chame-a com x = 21, depois imprima x.