[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 🙂


Anmelden zum Antworten