Da trilha de C++ Este conceito ainda não saiu como card do dia. ir para o card de hoje

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.
referencias.cpp
#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;
}

Exercícios

  1. 1
    Fácil

    Troca de valores usando referências

    Escreva uma função void trocar(int& a, int& b) que troca os valores de duas variáveis inteiras usando referências. No main, declare duas variáveis, chame a função e imprima os valores antes e depois da troca.

    Resolver
  2. 2
    Médio

    Contador de vogais com const&

    Escreva uma função int contar_vogais(const std::string& texto) que retorna o número de vogais (a, e, i, o, u, maiúsculas ou minúsculas) na string passada. Use const& para evitar cópia. No main, leia uma string do usuário e imprima o resultado.

    Resolver
  3. 3
    Desafio

    Evitando referências pendentes

    Escreva uma função const std::string& escolher_maior(const std::string& a, const std::string& b) que retorna uma referência para a string de maior comprimento. Explique por que essa implementação é perigosa e proponha uma versão segura que retorne uma cópia. No main, demonstre o uso correto da versão segura.

    Resolver

Continue estudando