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ção | Copiar Construtor | Operador de Atribuição |
---|---|---|
Basic | O construtor de cópia é um construtor sobrecarregado. | O operador de atribuição é um operador bit a bit. |
Significado | O 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. |
Sintaxe | class_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ória | O 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ão | Se 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
- Um construtor de cópia é um operador sobrecarregado, onde um operador de atribuição é um operador bit a bit.
- 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.
- 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.
- 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.
- 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.