Cópia, movimento e propriedade
Cópia superficial e profunda, atribuição, autoatribuição, movimento e regras de três, cinco e zero.
Que cópia preciso?
| Expressão | Significado |
|---|---|
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
- Constrói
copia(outro)completa. - Troca com o destino, sem lançar.
- 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;
}
| Fase | c | Temporário |
|---|---|---|
| Antes | 2, 3, 5 | Não existe |
| Preparar | Intacto | 9, 6 |
| Trocar | 9, 6 | 2, 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
Bufferfica vazia. Na biblioteca padrão, um objeto movido continua válido mas sem estado prometido; tipos comounique_ptrdão garantias adicionais, e nos teus tipos vale o contrato que escreveres. - Depois de mover um
vector, podes destruir, atribuir ou consultarsize(). Ler elementos continua a exigir a pré-condição própria, como um índice dentro do tamanho. std::moveapenas permite selecionar movimento. Se não houver operação de movimento aplicável, a inicialização pode copiar.noexceptno movimento ajuda contentores a escolhê-lo na realocação.
| Regra | Quando rever |
|---|---|
| Três | Destrutor, cópia e atribuição de cópia com gestão manual |
| Cinco | As três mais movimento de construção e de atribuição |
| Zero | Prefere vector e evita escrever operações próprias |
Valor copia independente. Propriedade exclusiva proíbe cópia e permite movimento.