Wie zum initialisieren einen Konstruktor mit nimmt, dass Strings als Parameter?
Ich bin nicht sicher, dass ich mich mit der richtigen Terminologie, aber die Frage ist, wie muss ich richtig stellen Sie einen Konstruktor nimmt einen string als parameter?
Bin ich verwendet, um mit einem const char *
im Konstruktor statt des strings.
Normalerweise würde ich so etwas tun:
Name(const char* fName, const char* lName)
: firstName(0), lastName(0)
{
char * temp = new char [strlen(fName) + 1];
strcpy_s(temp, strlen(fName) + 1, fName);
firstName = temp;
char * temp2 = new char [strlen(lName) + 1];
strcpy_s(temp2, strlen(lName) + 1, lName);
lastName = temp2;
}
Was ist, wenn der Konstruktor ist:
Name(const string fName, const string lName) { }
Tun habe ich immer noch Basis-member-Initialisierung? noch muss ich die Verwendung von string Kopie in der Basis der Konstruktor?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
std::string
und Initialisierer-Listen:In diesem Fall, Sie brauchen nicht zu verwenden, schrecklich bare Zeiger, die Sie nicht brauchen, Speicher, Zeichen kopieren, und schließlich de-allocate. Darüber hinaus ist dieser neue code hat Chancen, um die Vorteile verschieben statt kopieren seit
std::string
ist beweglich. Auch ist es nützlich zu Lesen diese.Und so weiter....
""
.std::move
in der Initialisierungsliste. Außerdem ist dies ein gutes Beispiel für move-Semantik, da Sie nur noch 1 Exemplar; genau das gleiche wie wenn Sie benutzt hatte, einen Verweis.std::move
Ich sehe, dass Sie bereits akzeptiert haben, eine Antwort aber ich würde gerne erweitern auf die Antworten.
Als deepmax sagte, wenn Sie von Wert schreiben Sie den Konstruktor nutzen, der "move-Semantik". Dies bedeutet, dass anstelle von kopieren von Daten, kann es bewegt werden von einer Variablen zu einer anderen.
Geschrieben, etwa so:
Scheint wie eine gute Idee, aber in Wirklichkeit ist es nicht effizienter ist als der copy-Konstruktor
Der Grund dafür ist, weil in den Allgemeinen Anwendungsfall sieht wie folgt aus:
nur eine Kopie immer bekommen, entweder Weg (siehe copy elision), und im anderen Fall von
2 Kopien gemacht werden, die "effizient" pass-by-value move-Semantik Weg!
Dies ist ein gutes Beispiel, wenn der copy-Konstruktor (oder pass-by-reference) sollte verwendet werden, nicht ein Beispiel gegen Sie.
Im Gegenteil...
Wenn Sie schreiben, ein expliziter Konstruktor, der move-Semantik konnte man sich eine effiziente Lösung, egal die Umstände.
Hier ist, wie Sie schreiben, einen Namen Klassendefinition mit den beiden Konstruktoren:
Dann, wenn Sie die Klasse verwenden, die effizienter Weg genommen werden sollte.
Wenn wir gehen zurück auf unsere Beispiele, die wir umschreiben können, Sie zu nutzen, die besten oder effizientesten Konstruktor:
Nie einfach für selbstverständlich zu nehmen, dass eine Lösung besser ist als alle anderen!
Bin ich verwendet, um dies zu tun:
Mithilfe der Verweise spart die Arbeit des Kopierens des strings in ein neues Objekt auf dem stack, es wird einfach die Referenz auf den vorhandenen string. Sobald Sie die Zuordnung zu den Klasse Mitgliedern, Sie werden kopiert.
new Name(getSomeString(), getSomeString())
würden, hätten wir zwei Exemplare pro argument: 1) aus getSomeString() aufgerufene, 2) von der aufgerufenen Funktion an die Schüler. Wenn wir das gleiche Taten, mithilfe des pass by value), wir würden nur eine Kopie: von getSomeString() der Klasse Mitglied. Hab ich das richtig verstanden?Name name("Martijn","Courteaux");
) es wird move die Werte, und Sie haben keine Kopie. Im Falle der nicht-temporären Objekte übergeben (z.B.Name name(fn, ln);
) Sie haben eine Kopie als identisch mit der übergabe by reference. Summary: als Wert Übergeben werden, können unnötige Kopien für temp-Objekte. Daher ist es logisch zu bevorzugen es.Name name
- Objekt auf dem Stapel, so kann der compiler nur legte es sofort an der richtigen position. Aber ich redete einnew
-ly erstellte Objekt (auf dem heap).new Name("Martijn", "Courteaux");
(new
, also auf dem heap). Es würde nicht keinen Unterschied machen, wenn wir haben pass-by-value oder by reference, richtig? Es kopieren müsste beide Male einmal?Name
ist auf stack oder heap. Pass-by-value hat die chance, sich zu bewegen, diese Namen auf die Schüler, anstatt Sie zu kopieren.wenn Sie behalten möchten, const char * als Konstruktor-input-Typen tun dies.
Können Sie konstruieren eine std::string aus const char.