next up previous contents
Next: Objetos e funções Up: Classes e Encapsulação Previous: Funções em linha   Sumário

Construtores e Destrutores

Construtores são basicamente funções de inicialização de uma classe, as quais são invocadas no momento em que objetos desta classe são criadas. Eles permitem inicializar campos internos da classe e alocar recursos que um objeto da classe possa demandar, tais como memória, arquivos, semáforos, soquetes, etc.

A função construtor de uma classe é reconhecida por ter o mesmo nome da classe. Por exemplo, um construtor para uma classe chamada rectangle seria a função rectangle(). É possível definir-se mais de um construtor; em outras palavras, a função membro construtor, assim como qualquer outra função membro de uma classe, pode ser sobrecarregada.

Construtores podem ser usados para suportar a inicialização de valores internos da classe durante a declaração de objetos. Neste caso, os argumentos da função construtor são os valores que deverão ser inicializados para os dados do objeto. Quando este recurso for utilizado, é importante observar que construtores devem ser definidos de forma a cobrir todos as formas de inicialização desejadas -- por exemplo,um construtor sem argumentos para objetos não inicializados na declaração, ou que assumam valores default.

Destrutores realizam a função inversa: são funções invocadas quando um objeto está para ``morrer''. Caso um objeto tenha recursos alocados, destrutores devem liberar tais recursos. Por exemplo, se o construtor de uma classe alocou uma variável dinamicamente com new, o destrutor correspondente deve liberar o espaço ocupado por esta variável com o operador delete.

A função destrutor de uma classe tem o mesmo nome da classe com um til (~) como prefixo. Por exemplo, um destrutor para a classe rectangle seria chamado ~rectangle().

Quando um objeto é usado para inicializar outro, uma cópia bit a bit é feita. Em muitos casos, este mecanismo de cópia é perfeitamente adequado. Porém, há casos onde esta cópia simples pode ser perigosa; por exemplo, quando um objeto contém apontadores para áreas alocadas dinamicamente. Em tais casos, a cópia implicaria em um compartilhamento de dados que poderia não ter exatamente o efeito desejado.

Para tais situações, C ++ permite a definição de um construtor de cópia. Quando um construtor de cópia existe, a cópia por bits não é utilizada. A forma geral de declarar um construtor de cópia é

nome-classe (const nome-classe &obj) { ... };
Onde obj é uma referência para o objeto do lado direito da inicialização. A forma de uso é, assumindo que exista uma classe rectangle,
rectangle x = y;
ou
rectangle x(y);
Em qualquer caso, uma referência para y seria passada para obj.

Observe que o construtor de cópia só é chamado automaticamente para inicializações. Um comando de atribuição no meio de uma função não ativa o construtor de cópia -- se este for o efeito desejado, o operador = deve ser sobrecarregado.


next up previous contents
Next: Objetos e funções Up: Classes e Encapsulação Previous: Funções em linha   Sumário
Ivan Luiz Marques Ricarte 2001-06-01