Recomendado, 2024

Escolha Do Editor

Diferença entre o construtor de cópia e o operador de atribuição em C ++

Copie o construtor e o operador de atribuição, são as duas maneiras de inicializar um objeto usando outro objeto. A diferença fundamental entre o construtor de cópia e o operador de atribuição é que o construtor de cópia aloca memória separada para os dois objetos, ou seja, o objeto de destino recém-criado e o objeto de origem.O operador de atribuição aloca o mesmo local de memória para o objeto de destino recém-criado, bem como objeto de origem.

Vamos estudar a diferença entre o construtor de cópias e o operador de atribuição.

Gráfico de comparação

Base para ComparaçãoCopiar ConstrutorOperador de Atribuição
BasicO construtor de cópia é um construtor sobrecarregado.O operador de atribuição é um operador bit a bit.
SignificadoO construtor de cópia inicializa o novo objeto com um objeto já existente.O operador de atribuição atribui o valor de um objeto a outro objeto, ambos já existentes.
Sintaxeclass_name (cont class_name & object_name) {
// body do construtor
}
class_name Ob1, Ob2;
Ob2 = Ob1;
Invoca(1) Construtor de cópia invoca quando um novo objeto é inicializado com um existente.
(2) O objeto passado para uma função como um parâmetro de não referência.
(3) O objeto é retornado da função.
O operador de atribuição é chamado apenas ao atribuir ao objeto existente um novo objeto.
Alocação de memóriaO objeto de destino e o objeto de inicialização compartilham os diferentes locais de memória.O objeto de destino e o objeto de inicialização compartilham a mesma memória alocada.
PadrãoSe você não definir nenhum construtor de cópia no programa, o compilador C ++ fornecerá implicitamente um.Se você não sobrecarregar o operador "=", uma cópia bit a bit será feita.

Definição do construtor de cópia

Um “construtor de cópia” é uma forma de um construtor sobrecarregado . Um construtor de cópia é chamado ou chamado apenas para fins de inicialização. Um construtor de cópia inicializa o objeto recém-criado por outro objeto existente. Quando um construtor de cópia é usado para inicializar o objeto de destino recém-criado, o objeto de destino e o objeto de origem compartilham um local de memória diferente. As alterações feitas no objeto de origem não refletem no objeto de destino. A forma geral do construtor de cópia é

 class_ name (nome_da_classe & nome_do_objeto) {. // construtor body of copy. } // object_name refere-se ao objeto no lado direito da inicialização. 

Se o programador não criar um construtor de cópia em um programa C ++, o compilador implicitamente fornecerá um construtor de cópia. Um construtor de cópia implícito fornecido pelo compilador faz a cópia de membro do objeto de origem. Mas, às vezes, a cópia de membro não é suficiente, pois o objeto pode conter uma variável de ponteiro. Copiar uma variável de ponteiro significa que copiamos o endereço armazenado na variável de ponteiro, mas não queremos copiar o endereço armazenado na variável de ponteiro, em vez disso, queremos copiar para o qual o ponteiro aponta. Portanto, há uma necessidade de 'construtor de cópias' explícito no programa para resolver esse tipo de problema.

Um construtor de cópia é invocado em três condições da seguinte forma:

  • O construtor de cópia invoca quando um novo objeto é inicializado com um existente.
  • O objeto foi passado para uma função como um parâmetro de não referência.
  • O objeto é retornado da função.

Vamos entender o construtor de cópia com um exemplo.

 cópia de classe {int num; public: copy () {} // cópia do construtor padrão (int a) {// inicializando o construtor num = a; } copy (copy & c) {// Copia o construtor num = c.num; } void show () {cout << num; }}; int main () {cópia A (200); // Objeto Uma cópia criada e inicializada B (A); // Copiador chamado copy C = A; // Copiador chamado copy D; D = A; // copia o construtor não chamado porque o objeto D não é objeto recém-criado. // é uma operação de atribuição. return 0; } 

No código acima, eu havia declarado explicitamente um construtor “copy (copy & c)”. Este construtor de cópia está sendo chamado quando o objeto B é inicializado usando o objeto A. Segunda vez ele é chamado quando o objeto C está sendo inicializado usando o objeto A. Quando o objeto D é inicializado usando o objeto A o construtor de cópia não é chamado porque quando D está sendo inicializado já está na existência, não na recém-criada. Portanto, aqui o operador de atribuição é chamado.

Definição de Operador de Atribuição

O operador de atribuição é um operador de atribuição de C ++. O operador "=" é usado para chamar o operador de atribuição. Ele copia os dados em um objeto de forma idêntica para outro objeto. O operador de atribuição copia um objeto para outro membro. Se você não sobrecarregar o operador de atribuição, ele executará a cópia bit a bit. Portanto, você precisa sobrecarregar o operador de atribuição.

 cópia de classe {int num; public: copy () {} // cópia do construtor padrão (int a) {// inicializando o construtor num = a; } void show () {cout << num; }}; int main () {cópia A (200); // Objeto Uma cópia criada e inicializada B (300); // Objeto B criado e inicializado B = A; // operador de atribuição chamado cópia C; C = A; // operador de atribuição invocado return 0; } 

No código acima, quando objectA é atribuído ao objeto B, o operador de atribuição está sendo chamado, pois ambos os objetos já existem. Da mesma forma, o mesmo é o caso quando o objeto C é inicializado com o objeto A.

Quando a atribuição bit a bit é executada, o objeto compartilha o mesmo local de memória e as alterações em um objeto refletem em outro objeto.

Principais diferenças entre o construtor de cópia e o operador de atribuição

  1. Um construtor de cópia é um operador sobrecarregado, onde um operador de atribuição é um operador bit a bit.
  2. Usando o construtor de cópia, você pode inicializar um novo objeto com um objeto já existente. Por outro lado, um operador de atribuição copia um objeto para o outro objeto, ambos já existentes.
  3. Um construtor de cópia é inicializado sempre que um novo objeto é inicializado com um objeto já existente, quando um objeto é passado para uma função como um parâmetro non refrence, ou quando um objeto é retornado de uma função. Por outro lado, um operador de atribuição é invocado apenas quando um objeto está sendo atribuído a outro objeto.
  4. Quando um objeto está sendo inicializado usando o construtor de cópia, o objeto de inicialização e o objeto inicializado compartilham o local de memória diferente. Por outro lado, quando um objeto está sendo inicializado usando um operador de atribuição, os objetos inicializados e inicializados compartilham o mesmo local de memória.
  5. Se você não definir explicitamente um construtor de cópia, o compilador fornecerá um. Por outro lado, se você não sobrecarregar um operador de assiduidade, uma operação de cópia bit a bit será executada.

Conclusão:

O construtor Copy é melhor para copiar um objeto para outro quando o objeto contém ponteiros brutos.

Top