C++
Home

Construtores e Destruidores

Abordando novamente os construtores, vamos ver que eles também podem receber valores, como funções normalmente. Só que para isso, temos que usar argumentos default. É considerado uma boa prática de programação e engenharia de softwere assegurar que um objeto seje completamente inicializado antes que o código cliente invoque as funções da classe.

Os membros de dados de uma classe não podem ser inicializados na definição da classe!
Tentar declarar um tipo de retorno para um construtor é um erro de sintaxe.

Exemplo simples de um construtor usando default:

#include <iostream>
using std::endl;

class teste {
public:
   teste( int = 0 );
   int a;
   void imprime();
};

teste::teste( int b ) // aqui b nao é igual a zero, soh na definição
{
   a = b;
}
void teste::imprime()
{
   std::cout << "valor: "<< a << endl;
}

int main()
{
   teste c;
   c.imprime();

   teste c2(10);    // outra instancia
   c2.imprime();    // a = 10

   std::cin;
   return 0;
}

Um destrutor é uma função membro especial de uma classe. O nome do destrutor é formado pelo caracter til ( ~ )seguido pelo nome da classe. O destruidor de uma classe é chamado quando um objeto é destruido, ele executa uma faxina na memória onde se situava o objeto.

O destruidor não recebe nenhum argumento e não retorna valor, cada classe pode ter somente um destruidor e também não é possivel sobrecarregar destruidores.

Tanto construtor como destuidor são chamados automaticamentes pela classe.
Objetos podem ser decladados como static, por isso, os construtores são chamados apenas uma vez nesse caso.
Os destruidores são executados quando main termina ou exit é chamada.. veremos mais a frente.

Agora um exemplo de construtore e destruidores... execute o programa e verifique as ordens de chamada. Muito interessante

#include <iostream>
using std::cout;
using std::endl;

class criar_destruir {
public:
  criar_destruir( int );   // construtor
  ~criar_destruir();      // destrutor
  int n;
};

criar_destruir::criar_destruir( int num )
{
  n = num;
  cout << "Objeto "<< n <<" criado" << endl;
}

criar_destruir::~criar_destruir()
{
  cout << "Objeto "<< n <<" DESTRUIDO " << endl;
}


void outros();   // prototipo para mais objetos do exemplo

// vamos agora criar um objeto global
criar_destruir n1( 1 );

int main()
{
  criar_destruir n2( 2 );
  static criar_destruir n3( 3 );

  outros();

  criar_destruir n4( 4 );

  std::cin;
  return 0;
}

void outros()
{
  criar_destruir n5( 5 );
  static criar_destruir n6( 6 );
  criar_destruir n7( 7 );
}

 

- Não se esqueça que:

Qualquer construtor que é chamado com um argumento pode ser usado pelo compilador para executar uma conversão implícita, na qual o tipo recebido pelo construtor é convertido em um objeto da classe na qual o construtor está definido. A conversão é automatica e o programador não usar um operador de coerção.