Um programa começa e termina no main?

De ccppbrasil.org

Programadores iniciantes, e até experientes têm a tendencia de pensar que um programa (em C e C++) começa e termina pelo main(). Isso, não é verdade, principalmente em C++, que tem a necessidade de que alguns objetos (streams por ex) sejam inicializados, para que possam ser utilizados pelo usuário.

Veja o programa abaixo:


#include <iostream>

using namespace std;

int main () {
   cout << "Esta é a função main";
   return 0;
}

Veja que nele você utilizou o objeto cout, mas em nenhum lugar do código este objeto foi inicializado, nem ao menos foi alocado recursos que ele necessita. Isso foi feito antes da função main ser chamada, e os recursos utilizados pelo objeto serão liberados depois que a função main terminar. A essa altura você está interessado em saber como você pode fazer isso!

Bom, quando você inicializa um objeto, o construtor dele é chamado e algum código é executado, quando o objeto é global e inicializado, ele é instanciado antes mesmo de main, e se ele foi instanciado sem o operador new, isto é, sem free store, o destrutor dele é chamado automaticamente depois que a função main acaba. Vamos utilizar isso que foi dito para resolver o seguinte problema: Sem mexer na função main do código acima, alteramos o programa para que apareça na tela:


Olá todos!
Esta é a função main
Até mais!

Então vamos para o código:


#include <iostream>

using namespace std;

class classe {
   public:
   classe (const char* parametro) {
      cout << parametro << endl;
   }
   ~classe () {
      cout << endl << "Até mais!" << endl;
   }
};

classe x("Olá todos!");

int main () {
   cout << "Esta é a função main";
   return 0;
}


Obs: Quando vários objetos globais são criados, apesar da ordem de construção ser desconhecida, os seus destrutores serão chamados na ordem inversa em que são inicializados.

Veja também:

  • Reduce EXE and DLL Size with LIBCTINY.LIB. A parte "The Dark Underbelly of Constructors" é particularmente interessante, pois fala sobre o assunto de como a chamada dos construtores e destrutores é implementado por um compilador.
Ferramentas pessoais