Programar em C++/Classes: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 525:
Um "copy constructor" é um construtor especial que toma como argumento a referência de um objeto da mesma classe e cria um novo objeto que é a copia do objeto em referência. Por padrão, o compilador providencia um "copy constructor" que faz a cópia membro por membro do objeto original, construindo um objeto idêntico. Isto é chamado de "shallow copy" ou "member wise"
.
Em algumas situações a cópia de um objeto não é satisfatória, para ver isso vamos ver a classe employeremployee, abaixo:
 
<source lang=cpp>
Linha 551:
Employee::~Employee()
{
delete[] _name;
}
 
Linha 591:
 
Nos temos 2 pointers ambos contendo o mesmo endereço. Imagine que agora um novo empregado é contratado. quando o nome for atualizado, não apenas iremos alterar o nome do empregado mas também do gerente. Finalmente, quando os objetos deixarem de ser usados e o destrutor da classe fizer a liberação de espaço na memória tentará liberar duas vezes para o mesmo endereço, provocando um erro no sistema de alocação dinâmica de memória, o que forçará o sistema operacional a eliminar o programa da memória.
 
Para resolver esse problema podemos definir um construtor de cópia ("copy constructor") na classe, substituindo a implementação padrão do compilador. Este recurso é automaticamente identificado e faz com que o compilador não crie a sua versão do construtor. Assim, definir um construtor de cópia próprio é a maneira mais eficiente quando nossos objetos detêm características que os fazem diferentes do padão.
 
Para criar o construtor basta definí-lo na classe:
 
<source lang=cpp>
#include <iostream>
using namespace std;
 
class Employee
{
public:
Employee( const Employee & e);
Employee(char *name, int id);
~Employee();
char *getName(){return _name;}
private://Other Accessor methods
int _id;
char *_name;
};
 
Employee::Employee( const Employee & e );
{
_id = e.id;
_name = new char[strlen(e._name) + 1]; //Allocates an character array object
strcpy(_name, e._name);
}
 
</source>
 
Agora temos um construtor que pode fazer a cópia da forma correta. Neste novo construtor alocamos uma cadeia de caracteres para copiar o conteúdo da original no objeto a ser copiado e copiamos o conteúdo para o novo objeto. Assim, teremos objetos distintos, cada um com seu próprio conteúdo.
 
== Ver também ==