C++ Memória Básico
Referências
Em C++, uma referência é um apelido para uma variável existente. Diferente de um ponteiro, ela não pode ser nula, não pode ser reassociada e deve ser inicializada na declaração. Referências são usadas principalmente para passar argumentos por referência, evitando cópias e permitindo modificar o valor original.
Uma referência constante (const&) é usada para passar argumentos sem cópia e sem permitir modificação. Isso é essencial para tipos grandes, como std::string e std::vector, pois evita cópias desnecessárias e protege o dado original.
Passar por referência é diferente de passar por valor: na passagem por valor, uma cópia é feita; na passagem por referência, a função opera diretamente sobre o objeto original. Isso é útil para modificar o argumento ou para evitar cópias custosas.
Referências pendentes (dangling references) ocorrem quando uma referência se refere a um objeto que já foi destruído. Isso geralmente acontece ao retornar referências para variáveis locais ou ao armazenar referências para objetos temporários. Usar uma referência pendente é comportamento indefinido e deve ser evitado.
Pontos-chave
- Uma referência é um apelido para uma variável existente e deve ser inicializada na declaração.
- Referências não podem ser nulas e não podem ser reassociadas a outro objeto.
const&permite passar argumentos sem cópia e sem modificação, ideal para tipos grandes.- Passar por referência (
T&) permite modificar o argumento original dentro da função. - Referências pendentes surgem quando o objeto referenciado deixa de existir, causando comportamento indefinido.
#include <iostream>
#include <string>
// Passagem por referência: modifica o argumento original
void dobrar(int& x) {
x *= 2;
}
// Passagem por referência constante: evita cópia e não modifica
void imprimir(const std::string& s) {
std::cout << "String: " << s << '\n';
}
int main() {
int a = 10;
int& ref = a; // ref é um apelido para a
ref = 20; // modifica a através de ref
std::cout << "a = " << a << '\n'; // 20
dobrar(a);
std::cout << "a dobrado = " << a << '\n'; // 40
std::string texto = "Olá, referências!";
imprimir(texto); // sem cópia
return 0;
}