Sempre que eu encontrava a expressão “Copy constructor” ou “Construtor de cópia” e o parâmetro tinha um &, eu ficava tentando lembrar do porquê o nome era “por cópia…” se o parâmetro estava sendo passado por referência. Calma, se você não trabalha com c++ todos os dias, isso não é algo tão absurdo de se esquecer.
Olhe o código abaixo:
Infelizmente esse código compila, porque como MyContainer não declara nenhum construtor por cópia e nem um operador de atribuição por cópia, então os compiladores gerarão essas funções (se forem necessárias). Para ter certeza que o compilador gerou um construtor de cópia (além do fato de compilar), vamos ver no clang-check, rodando o comando:
Output:
Veja que a linha 9 do Output que se refere a linha 20 da source, está chamando o construtor de cópia gerado pelo Compilador.
Isso foi apenas para mostrar porque o código compilou, mesmo sendo um código que vai explodir no destrutor porque o membro ponteiro “elems” é apontado para o mesmo endereço em c1 e c2.
Voltando ao título
Então porque tem uma referência no construtor de cópia? A resposta é que ele precisa receber como argumento uma referência ao objeto que deve copiar. É referência e não cópia, porque não queremos copiar o argumento do construtor, que define o que copiar. Falando de forma mais simples ainda, se chama construtor de cópia, porque a função dele é copiar todos os elementos de um objeto de um mesmo tipo para outro.
Um pouco besta, mas de vez em quando eu me pegava nessa dúvida haha.
Quando eu melhorar minhas skills em assembly, eu faço um update no post utilizando o VC++, no momento não deu muito certo ;)