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}
}
Foi útil?

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)
{}  
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top