Cópia profunda c ++

Cópia profunda c ++
A cópia significa o mesmo para a mesma réplica de um objeto original. Na programação, existem métodos diferentes para criar cópias de objetos. A cópia dos objetos, as variáveis ​​podem ser feitas com um construtor de cópia ou usando o operador de atribuição padrão “=”. Dois tipos de cópias podem ser feitos dentro do código C ++, i.e., cópia rasa e profunda. Você pode usar um para copiar qualquer variável ou objeto no código. Quando nosso objeto possui variáveis ​​que são alocadas dinamicamente ao longo do programa, precisamos criar uma cópia profunda desse tipo de objeto. Este artigo verá como uma cópia profunda pode ser criada em C++.

Cópia superficial vs. Cópia profunda

Antes de olhar para o exemplo de cópia profunda, é preciso entender a cópia rasa também. Portanto, a cópia rasa foi criada quando você deseja copiar todas as variáveis ​​de um objeto para outro objeto. Você pode chamá -lo de imagem espelhada, mas não é o original. Os objetos originais e novos, eu.e., Réplica, estará referenciando o mesmo endereço de memória dentro da cópia rasa. Isso significa que os objetos originais e réplicas serão reconhecidos e buscados com o mesmo endereço de memória. Quando um usuário tenta fazer alterações em um objeto, refletirá automaticamente a mudança em outro objeto também devido ao mesmo endereço de memória. Isso pode causar muitos erros durante a execução, e o objeto real e réplica será destruído. Assim, diz -se que evita o uso de cópias rasas quando você está trabalhando com variáveis ​​alocadas dinamicamente de um determinado objeto.

Recomenda -se usar a cópia profunda em vez da cópia rasa enquanto usa as variáveis ​​alocadas dinamicamente. A cópia profunda pode ser obtida copiando todos os dados de um objeto, eu.e., Valores variáveis, alocação de memória e recursos, para o novo, enquanto o objeto Real e Replica tem um endereço de memória completamente diferente. Pode ser usado para um objeto com variáveis ​​que são alocadas dinamicamente. Então, vamos começar.

Exemplo: cópia profunda

Iniciamos nosso exemplo para demonstrar o conceito de cópia profunda dentro da programação C ++, abrindo o console do Shell do Ubuntu 20.04 Sistema. A primeira coisa a fazer é produzir um novo arquivo C ++ para o código. O comando eterno, antigo e mais simples fornecido pela distribuição Linux para criar um documento em seu terminal de shell é a instrução "touch". A palavra simples "toque" será usada com o título de um documento a ser gerado. Certifique -se de adicionar a extensão C ++ no final do nome do documento; Caso contrário, o código não funcionará no shell na execução do arquivo. Após esta criação de arquivos, vem o passo para abri -lo.

A melhor coisa sobre o Ubuntu 20.04 IS, ele vem com alguns editores embutidos para abrir e editar arquivos. Ele contém o editor "Vim" para editar em um ambiente muito colorido, o editor de texto para atualizar e editar o código no ambiente mais simples e o editor da GNU Nano para criar e editar o código no shell. Assim, expulsamos o editor de código, eu.e., Editor do GNU Nano em nosso caso, e a palavra nano é usada para abrir o documento “Deep.CC ”. As instruções para gerar e lançar o documento “Deep.CC ”são declarados na captura de tela abaixo.

Depois que o editor do GNU Nano para o código lançou o documento de texto “Deep.cc ”nele, temos que adicionar algumas bibliotecas nele primeiro. Essas bibliotecas são necessárias para a execução do código de uma certa maneira. O fluxo de entrada-saída "IO" está incluído usando a palavra "incluir" com um personagem de hash, i i.e., "#". O uso de um espaço para nome padrão é necessário para o código C ++ usar as declarações CIN e Cout. O código foi iniciado com a declaração de uma nova classe chamada "teste". Esta aula foi inicializada com três membros de dados inteiros do tipo privado. As variáveis ​​"len" e "wid" são as variáveis ​​inteiras normais, enquanto a "idade" é uma variável de ponteiro. O construtor test () foi inicializado e é usado para inicializar diretamente o ponteiro "idade" com algum valor inteiro dinamicamente.

Uma função definida pelo usuário chamada "set" sem tipo de retorno foi iniciada. São necessários três argumentos do tipo inteiro em seus parâmetros, eu.e., "L", "W" e "A". Esta função é usada aqui para obter os valores da função principal () e armazená -los dentro das variáveis, ou os membros de dados declarados antes no início de um "teste" da classe i.e., "Len", "Wid" e Tipo de ponteiro variável "idade". Outra função definida pelo usuário chamada "Display ()" foi usada sem valores paramétricos. Esta função usa uma única instrução cout padrão dentro dela. A instrução Cout usa as variáveis ​​"len", "wid" e "*idade" para exibir os valores já definidos pela função set ().

Agora, estamos usando o parametrizado teste de função do construtor () da classe “teste” para implementar o conceito de cópia profunda em nosso programa. Este construtor parametrizado será chamado quando um novo objeto for criado. Está obtendo o ponteiro do tipo "teste" da classe em seu parâmetro, eu.e., objeto original. Este primeiro objeto passado dentro dos parâmetros será usado para copiar todos os dados do objeto original dentro do novo objeto, como é demonstrado na imagem. O destruidor de teste de classe foi usado para destruir o objeto do teste de classe enquanto exclui a variável de memória alocada dinamicamente "idade" após a execução do programa estar prestes a concluir. A aula de teste foi fechada aqui e a execução será iniciada com a função principal.

Agora, a função principal vem. A execução começa a partir daqui quando o primeiro objeto, "T1" do teste de classe, é criado. O construtor "test ()" será executado automaticamente com a criação do objeto "T1" e atribuindo memória dinâmica da cúpula à variável dinâmica "idade". A função set () foi chamada usando o objeto T1 e, para definir os valores para as variáveis, a função Display () será chamada para mostrar os valores no shell. O segundo objeto, T2, foi criado Arquivo Copiar Deep todos os dados do objeto T1 por atribuição. O construtor parametrizado será chamado aqui. Quando chamamos o método Display () com o objeto T2, ele mostrará o mesmo resultado do objeto 1. O destruidor será executado automaticamente quando o objeto terminou de funcionar.

Após a compilação com G ++ e execução com “./a.fora, ”Temos os mesmos resultados do método Display () para objetos T1 e T2.

Conclusão

Dentro deste guia do artigo, você descobrirá a explicação de cópia profunda, juntamente com uma demonstração de exemplo. Iniciamos este guia definindo os termos de cópia, cópia profunda e cópia rasa. Em seguida, abordamos a diferença entre usar cópia profunda e cópia rasa no código C ++ para copiar objetos. Adicionamos um exemplo breve e simples do programa de cópia profunda para demonstrar mais. Portanto, acreditamos que este artigo seria muito benéfico para todos os usuários ingênuos de C ++ e aqueles que já são especialistas em seu domínio.