Pular para conteúdo

Tipos, Valores e Referências

Os tipos de C++ determinam operações válidas, representação, seleção de overload, regras de vida dos objetos e restrições genéricas.

Tipos fundamentais e compostos

Tipos fundamentais incluem booleanos, caracteres, inteiros, ponto flutuante e void. As larguras de int e long não são universais; use tipos como std::int32_t somente quando disponíveis e quando a largura integrar o contrato.

Tipos compostos incluem arrays, funções, ponteiros, referências, classes, enums e ponteiros para membros.

int value = 42;
int* pointer = &value;       // may be reseated; can be null
int& reference = value;      // aliases value; must be initialized
int const& view = value;     // read-only access through this reference

const restringe mutação por um caminho de acesso; não prova que outro alias não possa alterar o objeto. Constância lógica pode permitir caches cuidadosamente sincronizados via mutable, mas mutação indiscriminada viola expectativas.

Categorias de valor

Expressões possuem tipo e categoria de valor:

  • lvalue: identifica objeto ou função com identidade persistente;
  • xvalue: identifica objeto cujos recursos podem ser reutilizados;
  • prvalue: calcula valor para inicializar objeto ou operando.

Elas influenciam vínculo de referências, overload, materialização, cópia e movimentação. “Tudo está na stack ou no heap” não é o modelo de objetos de C++.

Inicialização

int count{0};
std::string title{"Algorithms"};
auto length = title.size();

Inicialização com chaves rejeita muitas conversões estreitadoras. auto deduz o tipo do inicializador; não torna C++ dinamicamente tipado. Verifique a dedução quando referências, const superior, proxies ou listas importarem.

Conversões

Conversões implícitas alteram sinal, faixa, precisão ou overload. Aritmética signed/unsigned produz comparações surpreendentes. Prefira conversões explícitas e valide antes de estreitar.

  • static_cast: conversão da linguagem verificada em compilação;
  • dynamic_cast: verificação em runtime em hierarquias polimórficas;
  • const_cast: altera qualificação cv, mas não torna objeto realmente const mutável;
  • reinterpret_cast: reinterpretação de baixo nível com usos restritos.

Views e vida útil

std::span<T> observa elementos contíguos; std::string_view, caracteres. Nenhum normalmente possui o armazenamento.

std::string_view invalid_view() {
    std::string local{"temporary"};
    return local; // dangling view after local is destroyed
}

Toda view não proprietária exige que o objeto referenciado sobreviva a todos os usos.

Exercícios

  1. Diferencie int const*, int* const e int const* const.
  2. Encontre o defeito de vida útil ao retornar view de armazenamento local.
  3. Explique por que auto preserva tipagem estática.