Welche Konstruktoren werden aufgerufen?



  • Hi,

    ich habe hier eine alte Klausuraugabe bei der ich mir absolut nicht sicher bin.
    Gefragt ist, in welcher Zeile Konstruktoren der Klasse "string" aufgerufen werden... und wenn ja, welche:

    1: //Programm 1
    2: string getline()
    3: {
    4: char buf[100];
    5: gets(buf);
    6: String ret = buf;
    7: return ret;
    8: ;

    Meine Vermutung lautet so:
    2: Standardkonstruktor, es wird Platz für 100 Buchstaben angelegt.
    5: Kopierkonstruktor, die Tastatureingabe wird in den String buf Kopiert
    6: Standardkonstruktor: In dem überladenen Zuweisungsoperator von String wird der String reg angelegt, danach wird ihm buf zugewiesen

    // Programm2
    1: //Programm 1
    2: string getline()
    3: {
    4: char buf[100];
    5: gets(buf);
    6: return buf;
    7: }

    Hier würde ich genau dasselbe sagen, nur das hier kein string "ret" angelegt wird... allerdings gehe ich davon aus, dass ich da etwas gehörig übersehe.

    Was meint ihr?

    Greez
    Haimi



  • Bitte benutze [cpp]Code[/cpp].

    string getline()
    {
        char buf[100];
        gets(buf);
        string ret = buf;  //Defaultkonstruktor, string::operator=(char*)
        return ret;  //Kopierkonstruktor
    }
    

    ACHTUNG: 100%-ig sicher bin ich mir beim ersten nicht und außerdem darf der Compiler Kopierkonstruktoraufrufe wegoptimieren. Du kannst das also gar nicht genau sagen.

    Für das zweite Programm gilt, dass beim return string::string(char 😉 und evtl. noch string::string(string const &) aufgerufen wird.



  • Stimmt, bei der Rückgabe müsste auch einer aufgerufen werden. Vielen Dank schon mal...

    Wird bei

    char buf[100]
    

    kein Konstruktor aufgerufen?



  • Nein, wieso? Das ist ein Array von char. (Außer natürlich, wenn du char::char() als eigenständigen Konstruktor ansiehst)



  • wxSkip schrieb:

    string ret = buf;  //Defaultkonstruktor, string::operator=(char*)
    

    Falsch. Hier wird der Konstruktor für const char * aufgerufen.



  • Haimi schrieb:

    1: //Programm 1
    2: string getline()
    3: {
    4: char buf[100];
    5: gets(buf);
    6: String ret = buf;
    7: return ret;
    8: ;

    Meine Vermutung lautet so:
    2: Standardkonstruktor, es wird Platz für 100 Buchstaben angelegt.

    Nein, das ist ein char-Array und hat nichts mit der String-Klasse std::string zu tun.

    5: Kopierkonstruktor, die Tastatureingabe wird in den String buf Kopiert

    Wiederum nur ein char-Array.

    6: Standardkonstruktor: In dem überladenen Zuweisungsoperator von String wird der String reg angelegt, danach wird ihm buf zugewiesen

    Nein, hier wird der Konstruktor string::string(const char*) aufgerufen, denn

    string ret = buf
    

    ist dasselbe wie

    string ret(buf)
    

    , da der genannte Konstruktor nicht als explicit deklariert worden ist.

    Zeile 7: Theoretisch der Kopierkonstruktor. Dieser wird aber höchstwahrscheinlich wegoptimiert.

    // Programm2
    1: //Programm 1
    2: string getline()
    3: {
    4: char buf[100];
    5: gets(buf);
    6: return buf;
    7: }

    Hier ist ein Aufruf von [c]string::string(const char*)[/cpp] in Zeile 6.

    Alle Angaben ohne Gewähr. Denn dem Compiler ist bei solchen Sachen ziemlich freigestellt, wie er es macht.



  • Danke für die Antworten 🙂
    Das werde ich mir noch ausführlich durch den Kopf gehen lassen, ihr habt mir sehr gut weitergeholfen...


Anmelden zum Antworten