É este uma cópia ctor válido?
-
19-09-2019 - |
Pergunta
Gostaria de saber se há algo de errado com a função de construtor de cópia abaixo?
class A
{
private:
int m;
public:
A(A a){m=a.m}
}
Solução
Duas coisas:
-
Copiar construtores deve ter referências como parâmetros, caso contrário, eles são infinitamente recursiva (na verdade a língua não irá permitir que você declarar esses construtores)
-
Não faz nada a ctor cópia padrão não faz, mas fá-lo mal - você deve usar inicialização listas em um ctor cópia sempre que possível. E se o ctor cópia padrão faz o que quiser, não ser tentado a escrever uma versão si mesmo -. Você provavelmente só irá começar errado, e você precisa mantê-lo
Outras dicas
Existem 3 problemas.
Primeiro, você esqueceu ";" no final do m = a.m para que o seu código não compilar.
Em segundo lugar, passando por referência é o preferido na maioria dos casos em que você passa algo com tamanho maior do que o tamanho de um registo da sua plataforma.
Em terceiro lugar, desde que você não está indo para alterar o objeto de origem, é melhor tê-lo com const. Então, finalmente, este é o que nós temos:
A (const A & A): m (a.m) {}
O problema é que o construtor de cópia é chamado de parâmetro passado por valor. Então você tem que passar o parâmetro do construtor de cópia por referência (geralmente de referência const), se você não quer uma recursão não terminação. Uma questão menor é que você não está usando a lista de inicialização, que é preferível para inicializar o membro. Fixação ambas as questões:
A(A const& a)
: m(a.m)
{}