Objekt in for-Schleife; Wann wird der Konstruktor aufgerufen?



  • Hallo zusammen!

    ...folgender (Pseudo-)Code:

    for(int i = 0; i < ANZAHL; i++)
    {
       string str;
       str.assign(...);
    }
    

    Wird nun das Objekt (str) bei jedem Durchgang neu erstellt ? Wenn ja, würde doch der Konstruktor bei jedem Schleifeneingang aufgerufen und bei jedem Schleifenausgang der Destruktor, oder?!

    DAnke schonmAl!!! 👍 🙂



  • NeedSomeInfo schrieb:

    Wird nun das Objekt (str) bei jedem Durchgang neu erstellt ?

    jo .



  • Super danke; das heißt ein break bzw continue in der Schleife hätte direkt den (autom.) Aufruf des Destruktors zu Folge, richtig ?



  • ach, sry noch ne Frage:
    kann ich damit einen neuen Block/Scope erstellen:

    {
       string str;
       // str gibt es nur innerhalb der Klammern ?!
    }
    

    Also die Klammern stehen einfach 'so' da; keine Funktion, kein if...; geht das ?



  • der destruktor wird immer aufgerufen wenn das objekt seinen gueltigkeitsbereich verlaesst - sobald der schleifenkopf neu abgefragt wird ist er ausserhalb des blockes und dadurch entsprechend einen destrukt



  • Ja klar und bei der letzten Frage ?



  • NeedSomeInfo schrieb:

    Also die Klammern stehen einfach 'so' da; keine Funktion, kein if...; geht das ?

    jo
    Edit: Bei sowas einfach mal ausprobieren (hilft immer)



  • NeedSomeInfo schrieb:

    ach, sry noch ne Frage:
    kann ich damit einen neuen Block/Scope erstellen:

    {
       string str;
       // str gibt es nur innerhalb der Klammern ?!
    }
    

    Also die Klammern stehen einfach 'so' da; keine Funktion, kein if...; geht das ?

    jo.
    das ist ein recht beliebter trick, um variablen kurzlebiger zu machen.
    beispiel:

    int main(){
       int z=0;
       ifstream in("zahl.txt");
       in>>zahl;
       ++zahl;
       cout<<"Ich wurde "<<zahl<<" mal aufgerufen.\n";
       ofstream out("zahl.txt");
       out<<zahl;
       return 0;
    }
    

    hier kann alles mögliche passieren. es ist generell eine schlechte idee, eine datei gleichzeitig zum lesen und zum schreiben offen zu haben. die schlechte lösung:

    int main(){
       int z=0;
       ifstream in("zahl.txt");
       in>>zahl;
       in.close();
       ++zahl;
       cout<<"Ich wurde "<<zahl<<" mal aufgerufen.\n";
       ofstream out("zahl.txt");
       out<<zahl;
       out.close();
       return 0;
    }
    

    jetzt gehts ganz bestimmt.
    die gute lösung:
    einfach die objekte frühzeitig sterben lassen.

    int main(){
       int z=0;
       {
         ifstream in("zahl.txt");
         in>>zahl;
       }
       ++zahl;
       cout<<"Ich wurde "<<zahl<<" mal aufgerufen.\n";
       {
         ofstream out("zahl.txt");
         out<<zahl;
       }
       return 0;
    }
    


  • Jupp, alles klar, vielen Dank!


Anmelden zum Antworten