Cópia, movimento e propriedade

Cópia superficial e profunda, atribuição, autoatribuição, movimento e regras de três, cinco e zero.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Que cópia preciso?

ExpressãoSignificado
T b = a;Constrói b com T(const T&)
b = a;Substitui o estado de b existente
  • Superficial copia endereços. Dois donos com o mesmo recurso partem na destruição.
  • Profunda cria recurso próprio e copia o conteúdo.
  • Partilha exige política explícita, como shared_ptr.

No Buffer, a cópia reserva outro.tamanho_ e copia cada posição. Mudar b não toca em a.

Atribuição sem perder nada

  1. Constrói copia(outro) completa.
  2. Troca com o destino, sem lançar.
  3. O temporário destrói o recurso antigo.
Buffer& operator=(const Buffer& outro) {
    if (this == &outro) return *this;
    Buffer copia(outro);
    trocar(copia);
    return *this;
}
FasecTemporário
Antes2, 3, 5Não existe
PrepararIntacto9, 6
Trocar9, 62, 3, 5

Se a reserva falha, o destino continua igual. É a garantia forte. Libertar primeiro perde o estado e parte na autoatribuição.

Movimento e regras

std::move só seleciona movimento. Quem transfere é a operação escolhida.

Buffer b(2);
Buffer d = std::move(b);  // b.size() = 0, d.size() = 2
  • Origem deste Buffer fica vazia. Na biblioteca padrão, um objeto movido continua válido mas sem estado prometido; tipos como unique_ptr dão garantias adicionais, e nos teus tipos vale o contrato que escreveres.
  • Depois de mover um vector, podes destruir, atribuir ou consultar size(). Ler elementos continua a exigir a pré-condição própria, como um índice dentro do tamanho.
  • std::move apenas permite selecionar movimento. Se não houver operação de movimento aplicável, a inicialização pode copiar.
  • noexcept no movimento ajuda contentores a escolhê-lo na realocação.
RegraQuando rever
TrêsDestrutor, cópia e atribuição de cópia com gestão manual
CincoAs três mais movimento de construção e de atribuição
ZeroPrefere vector e evita escrever operações próprias

Valor copia independente. Propriedade exclusiva proíbe cópia e permite movimento.

Buffer completo.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.