[Frage zu folg. Programm] ExecptionHandling und Ausgabe
-
Hallo,
ich bin dabei mich wieder in c++ einzuarbeiten und hänge im Moment an folgendem Beispiel fest.
/* * Was wird von dem nachfolgenden Programm auf die Standardausgabe ausgegeben? */ #include <iostream> using namespace std; class A { public: A(int i); A(const A& a); ~A(); int info() const; private: int ia; }; A::A(int i) : ia(i) { cout << "A:Konstruktor " << ia << endl; } A::A(const A& a) : ia(a.ia) { cout << "A:Kopierkonstruktor " << ia << endl; } A::~A() { cout << "A:Destruktor " << ia << endl; } int A::info() const { return ia; } void f(A a) throw (const char*, int) { cout << "Beginn f(" << a.info() << ")" << endl; if (a.info() > 5) { throw "a.info() > 5"; } else if (a.info() > 2 ) { throw a.info(); } cout << "Ende f(" << a.info() << ")" << endl; } int g(int i) { cout << "Beginn g(" << i << ")" << endl; switch(i - (i / 2) * 2) { case 0: { i += 3; } break; case 1: { i *= 2; } break; } #define VERSION1 #ifdef VERSION1 A a1(i); try { f(a1); } #else try { A a1(i); f(a1); } #endif catch (int i) { cout << "g: int-Ausnahme " << i << endl; } catch (const char* s) { cout << "g: char*-Ausnahme " << s << endl; throw; } cout << "Ende g(" << i << ")" << endl; return i; } int main() { /* 1 */ cout << "Beginn main()" << endl; /* 2 */ int i = 1; /* 3 */ try { /* 4 */ while (i < 10) { i = g(i); } /* 5 */ } /* 6 */ catch (int i) { cout << "main: int-Ausnahme " << i << endl; } /* 7 */ catch (const char* s) { cout << "main: char*-Ausnahme " << s << endl; } /* 8 */ cout << "Ende main()" << endl; cin.get(); /* 9 */ return 0; }Kann mir bitte jemand erklären, weshalb bei int i = 1 der Konstruktor als erstes in der Ausgabe erscheint und kein "Begin main()" im Ablauf erscheint?
Ich blicke da im Moment nur halb durch, wie welche Funktion die Werte übergibt.Hoffe auf Erklärungen, um den genauen Ablauf zu verstehen!
dankeschön!!
ciao
Daniel
-
Beginn main() Beginn g(1) A:Konstruktor 2 A:Kopierkonstruktor 2 Beginn f(2) Ende f(2) A:Destruktor 2 Ende g(2) A:Destruktor 2 Beginn g(2) A:Konstruktor 5 A:Kopierkonstruktor 5 Beginn f(5) A:Destruktor 5 g: int-Ausnahme 5 Ende g(5) A:Destruktor 5 Beginn g(5) A:Konstruktor 10 A:Kopierkonstruktor 10 Beginn f(10) A:Destruktor 10 g: char*-Ausnahme a.info() > 5 A:Destruktor 10 main: char*-Ausnahme a.info() > 5 Ende main()Das ist die genaue Ausgabe bei mir. Welchen Compiler benutzt du?
-
hmmm...komisch jetzt kommt das auch bei mir raus, obwohl ich vorher nix geändert hatte. Wird wohl die Hitze sein, sorry
