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, dennstring ret = bufist dasselbe wie
string ret(buf), da der genannte Konstruktor nicht als
explicitdeklariert 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...