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.
