Klausuraufgabe



  • {XXX* xPtr = new XXX;} // was wird hier gemacht?
        cout << a.gety() <<endl; 
    }
    


  • Schamote schrieb:

    daddy_felix schrieb:

    {
    int a = 5;
    
    { // erzeuge inneren Scope
    int a = 6; // das "äußere a" wird überdeckt
    cout << a; // gibt das innere a aus
    } // Ende innerer Scope -> Ende Lebensdauer des inneren a
    
    cout << a; // gibt äußeres a aus
    }
    

    Gibt es eine Möglichkeit die überdenkte Variable im Scope anzusprechen?
    Sowas ähnliches wie *this für Klassen etc?

    ::a für äußeres, a für inneres.

    S.lukas schrieb:

    {XXX* xPtr = new XXX;} // was wird hier gemacht?
        cout << a.gety() <<endl; 
    }
    

    Es wir ein Ptr auf XXX angelegt, dieser Pointer zeigt auf ein neu erschaffenes Objekt auf dem Heap vom Typ XXX. Im Prinzip wird nur ein weiteres XXX-Objekt angelegt.



  • Nathan schrieb:

    Schamote schrieb:

    daddy_felix schrieb:

    {
    int a = 5;
    
    { // erzeuge inneren Scope
    int a = 6; // das "äußere a" wird überdeckt
    cout << a; // gibt das innere a aus
    } // Ende innerer Scope -> Ende Lebensdauer des inneren a
    
    cout << a; // gibt äußeres a aus
    }
    

    Gibt es eine Möglichkeit die überdenkte Variable im Scope anzusprechen?
    Sowas ähnliches wie *this für Klassen etc?

    ::a für äußeres, a für inneres.

    S.lukas schrieb:

    {XXX* xPtr = new XXX;} // was wird hier gemacht?
        cout << a.gety() <<endl; 
    }
    

    Es wir ein Ptr auf XXX angelegt, dieser Pointer zeigt auf ein neu erschaffenes Objekt auf dem Heap vom Typ XXX. Im Prinzip wird nur ein weiteres XXX-Objekt angelegt.

    Ne. ::Identifier ist für global Scope. Hier gibts kein a im global Scope.



  • Nathan schrieb:

    S.lukas schrieb:

    {XXX* xPtr = new XXX;} // was wird hier gemacht?
        cout << a.gety() <<endl; 
    }
    

    Es wir ein Ptr auf XXX angelegt, dieser Pointer zeigt auf ein neu erschaffenes Objekt auf dem Heap vom Typ XXX. Im Prinzip wird nur ein weiteres XXX-Objekt angelegt.

    ... aber nicht wieder gelöscht. Dafür wäre ein "delete" notwendig.



  • wie kommt das ergebnis
    2
    6
    2
    3
    4



  • S.lukas schrieb:

    wie kommt das ergebnis
    2
    6
    2
    3
    4

    Richtig einrücken, dann sieht mans:

    int main()
    {
        XXX a/*1*/,b/*2*/;
        cout <<a.gety() <<endl; // 2
        {
            XXX a/*3*/,b/*4*/,c/*5*/,d/*6*/;
            cout <<a.gety()<<endl; // 6
        }/*5*/ /*4*/ /*3*/ /*2*/
    
        cout << a.gety() <<endl; // 2
    
        XXX c/*3*/;
        cout<<a.gety()<<endl; // 3
    
        {
            XXX* xPtr = new XXX/*4*/;
        }/*3*/
    
        cout << a.gety() <<endl; // 3
    }/*2*/ /*1*/ /*0*/
    


  • weil das so ist.

    Nimm dir mal den Code und kommentiere zu jeder(!) Zeile in der main(), wieviele Instanzen der Klasse nach Abarbeiten der jeweiligen Zeile deiner Meinung nach existieren.

    edit: hm... out hat dir ja schon die Antwort geliefert. Glück gehabt, brauchst nicht mehr übrlegen.

    edit2: out hat nen Fehler 😃 die mit "new" erzeugte Instanz wird nicht gelöscht!



  • out schrieb:

    {
            XXX* xPtr = new XXX/*4*/;
        }/*4*/
    
        cout << a.gety() <<endl; // 4
    }/*3*/ /*2*/ /*1*/ + Betriebssystem macht für dich noch ein delete: /*0*/
    

    Ach, da steht ein doofs new, Sorry.



  • vielen dank, an alle die sich beteiligt haben.
    ihr wart eine sehr sehr gute Hilfe.



  • Auch von mir ein großes Danke für die bildhafte und präzise Hilfe. So wie in diesem Thread auch:

    http://www.c-plusplus.net/forum/317898

    da versteht man dann - was und wie es gemeint ist.

    Warum schreibt ihr kein Buch? Oder ein Tutorial, das Netzt ist voll von PHP, Java Script und HTML Tutorials, aber zu C++11 ist wenig zu finden.

    Denn fürchterliches und bedrohliches kommt im September auf uns zu:

    http://www.amazon.de/von-bis-umfassende-Handbuch-Computing/dp/3836220210/ref=sr_1_4?ie=UTF8&qid=1372141516&sr=8-4&keywords=wolf+c%2B%2B

    (Ja, ich gebe es zu, ich bin auch einer von denen, die sich mit diesem Buch, in der 2. Auflage, einmal mächtig angeschissen haben. Zum Glück gibt es dieses Forum.)



  • Hallo,

    Als ich den Amazon Link gesehen hab musst ich erstmal loslachen 😃 👍
    Es vereint alle Dinge, die ich bis jetzt über schlechte C++ Bücher gelesen habe in einem...

    Ich habe das hier mal gelesen und bin auf eine Frage gestoßen... Wenn man einnerhalb eines scopes einen weiteres öffnet und eine Variable des selben Namens wie eine im Scope davor deklariert/definiert, dann überdeckt die Variable im Scope weiter innen die äußere, ok... ABER wieso sollte man so etwas machen wollen? Ist es nicht einfach nur schelchter Stil? Wieso nicht einfach einen anderen Variablenamen verwenden und wieso erlaubt der Compiler das überhaupt?

    mfg


  • Mod

    hardware schrieb:

    Ich habe das hier mal gelesen und bin auf eine Frage gestoßen... Wenn man einnerhalb eines scopes einen weiteres öffnet und eine Variable des selben Namens wie eine im Scope davor deklariert/definiert, dann überdeckt die Variable im Scope weiter innen die äußere, ok... ABER wieso sollte man so etwas machen wollen? Ist es nicht einfach nur schelchter Stil? Wieso nicht einfach einen anderen Variablenamen verwenden und wieso erlaubt der Compiler das überhaupt?

    Damit man im Scope außerhalb nicht aufpassen muss, ob nicht in einem tief verschachtelten Scope irgendwo ein Objekt mit gleichem Namen existiert oder jemals existieren könnte.
    Und gleichfalls für den inneren Scope: Damit man nicht aufpassen muss, ob in einem äußeren Scope irgendwo ein Objekt mit gleichem Namen existiert oder jemals existieren könnte.



  • achso... sprich ich kann das hier machen

    for (int i ...)
    {
        //Code mit i
        for (int i ....) {//Code mit i}
    }
    

    ohne Sorgen dass die i's sich irgendwie in die Quere kommen?

    mfg


  • Mod

    Ja. Und das ist auch gut so, stimmst du zu?

    P.S.: Kunden, denen das gefiel, mochten auch:

    class foo{};
    typedef foo bar;
    
    int main()
    {
      foo foo;
      bar bar;
    }
    


  • Naja, das ganze foo und bar Zeug ist nicht so mein Ding, vorallem trifft bei meinem Code oft eher dieses "fubar" zu... Allerdings stimme ich dem zu!

    mfg


Anmelden zum Antworten