Construtor de cópia em C ++ é chamado quando o objeto é retornado de uma função?
-
21-08-2019 - |
Pergunta
Eu entendo construtor de cópia é chamado em três instâncias
- Ao instanciar um objeto e inicializa-la com valores a partir de outro objeto.
- Quando passar um objeto por valor.
3. Quando um objeto é retornado de uma função por valor.
Eu tenho pergunta com no.3 se construtor de cópia é chamado quando o valor do objeto é retornado, não deveria criar problemas se o objeto é declarado localmente na função.
i significa que o construtor de cópia é uma cópia profunda e leva referência de um objeto como parâmetro
Solução
É chamado exatamente para evitar problemas. Um novo objeto servindo como resultado é inicializado a partir do objeto localmente-definida, então o objeto definido localmente é destruído.
Em caso de deep-construtor de cópia definido pelo usuário é tudo a mesma coisa. Em primeiro lugar o armazenamento é alocado para o objeto que servirá como resultado, em seguida, o construtor de cópia é chamado. Ele usa a referência passou para acessar o objeto definida localmente e copiar o que é necessário para o novo objeto.
Outras dicas
A cópia é feito antes que os chamados função sai, e copia a variável local então existente no valor de retorno.
A função chamada tem acesso à memória o valor de retorno irá ocupar, apesar de que a memória não é "no escopo" quando a cópia está sendo feito, ele ainda está disponível.
De acordo com a uma resposta à minha pergunta, o construtor de cópia pode ser chamado até duas vezes:. uma vez para copiar um objeto local para o retorno 'objeto', e uma vez para copiar o objeto de retorno para a variável foi atribuído a
No entanto, necessidade não ser! O compilador pode otimizar ambas construções cópia de distância.
Não, chama-o antes que os moradores estão destruídas. Você pode testar isso com um objeto que registros destruição e construção copiar, ou olhando para o código assembly gerado.
Há três casos gerais em que o construtor de cópia é chamado:
- Quando instanciar um objecto e inicializando-lo com valores a partir de um outro objecto (do mesmo tipo).
- Quando passar um objeto por valor.
- Quando um objeto é retornado de uma função por valor.