Ajude nosso projeto a se manter online.

Função Destruidor (destructor) em C++

 Neste tutorial de nosso curso de C++, vamos conhecer e aprender a usar as funções destruidoras.

A função Destruidor (Destructor)

No tutorial passado, falamos sobre a Função Construtor , que existe em toda classe e é executada sempre que um objeto é instanciado.

Analogamente, existe a função destruidor, que é executada apenas quando o objeto é destruído.

Para criarmos uma função destructor, basta definirmos uma função com o mesmo nome da classe, com o símbolo de til ( ~ ) antes. Vamos ver um exemplo, criando uma classe com construtor e destruidor:

#include <iostream>
using namespace std;

class Test
{
    public:
        Test();
        ~Test();
};

Test::Test()
{
    cout << "Constructor" << endl;
}

Test::~Test()
{
    cout << "Destructor" << endl;
}

int main()
{
    Test t;

    return 0;
}

O resultado vai ser as duas palavras na tela. Uma ocorre ao criarmos o objeto e outra ocorre quando o programa se encerra, e o nesse caso o destructor também é invocado.
E assim também como os construtores, toda classe tem destruidor. Mesmo que você não defina um, vai existir um padrão em branco, mas vai existir sempre.

Também não aceitam nenhum argumento, nem lista de parâmetros e não retornam nenhuma informação.

Para que serve a Função Destruidor ?

Basicamente, para fazer coisas que devem ser feitas quando um objeto deixa de existir.
Um exemplo muito comum é liberar memória que foi alocada dentro de um objeto.

No momento, estamos usando objetos bobinhos, pequenos, mas o normal é serem gigantes, com classes com centenas de variáveis e dezenas de funções. E lá dentro, é comum fazer alocação dinâmica de memória, e quando esse objeto deixar de existir, é uma boa prática liberar toda essa memória (principalmente em sistemas mais críticos com pouca memória, como seu relógio ou o sistema digital da sua geladeira).

Vamos supor que você criou um sistema pro banco, e quer sempre fazer um teste: se alguém acessou a classe Bank, instanciando algum objeto. Para isso, você define uma variável de escopo global chamada "spy" com valor inicial 0.

Pra verificar se algum objeto foi criado, faça com que 'spy=1' no destructor, veja:

#include <iostream>
using namespace std;

int spy=0;

class Bank
{
    public:
        ~Bank();
};


Bank::~Bank()
{
    spy = 1;
}

int main()
{
    Bank *b;
    b = new Bank;

    delete b;

    cout<<"Spy: " << spy << endl;
    return 0;
}

Vamos supor que seja uma classe gigante, com vários membros, várias coisas acontecendo...você criou um objeto, usou ele, fez tudo direitinho e tal. Então chega a hora de dar um delete nele, e nessa hora a função destructor vai ser executada.

O resultado vai ser 'Spy: 1' ali na main(), indicando que alguém mexeu nessa classe Bank. Ou seja, o destruidor, por sempre ser executado, vai executar a operação 'spy=1'.

Um outro exemplo função destructor, é se você criar um jogo e tiver um personagem (que é um objeto) e ele simplesmente morrer ou sair do jogo. Na sua função destruidor, você deleta o nome, tirar seus pontos, tira ele dos times, tira do ranking.

E etc etc, por ai vai pessoal, quase sempre tem coisas pra se fazer quando um objeto deixa de existir, ok?

Nenhum comentário:

Postar um comentário