Wie initialisiert man einen Konstruktor, der Strings als Parameter akzeptiert?

7

Ich bin mir nicht sicher, ob ich die richtige Terminologie verwende, aber Frage ist, wie mache ich einen Konstruktor, der einen String als Parameter akzeptiert?

Ich bin es gewohnt, im Konstruktor ein const char * anstelle von Strings zu haben.

Normalerweise würde ich so etwas tun:

%Vor%

Was ist, wenn der Konstruktor das ist?

%Vor%

Mache ich immer noch die Basismitgliedsinitialisierung? Muss ich in der Basis des Konstruktors weiterhin die Zeichenfolge kopieren?

    
Sarah 05.11.2013, 23:11
quelle

4 Antworten

9

Verwenden Sie std::string und Initialisierungslisten:

%Vor%

In diesem Fall müssen Sie keine schrecklich blanken Zeiger verwenden, Sie müssen keinen Speicher reservieren, Zeichen kopieren und schließlich die Zuweisung aufheben. Darüber hinaus hat dieser neue Code die Chance, die Vorteile des Verschiebens und nicht des Kopierens zu nutzen, da std::string beweglich ist. Es ist auch hilfreich, dies zu lesen.

>

Und so weiter ....

    
deepmax 05.11.2013, 23:13
quelle
6

Ich sehe, dass Sie bereits eine Antwort akzeptiert haben, aber ich würde gerne die Antworten erweitern.

Wie deepmax sagte, können Sie, wenn Sie den Wert übergeben, Ihren Konstruktor schreiben, um die "move semantics" zu nutzen. Das bedeutet, dass Daten nicht von einer Variablen in eine andere verschoben werden können.

So geschrieben:

%Vor%

Das scheint eine gute Idee zu sein, ist aber in Wirklichkeit nicht effizienter als der Kopierkonstruktor

%Vor%

Der Grund dafür ist, dass im allgemeinen Anwendungsfall das so aussieht:

%Vor%

es wird immer nur eine Kopie erstellt (siehe Kopie Elision ), und im anderen Fall

%Vor%

2 Kopien werden in der 'effizienten' Methode der semantischen Übergabe nach Wert erstellt!

Dies ist ein gutes Beispiel dafür, wenn der Kopierkonstruktor (oder der Pass-by-Reference) verwendet werden sollte, kein Beispiel dagegen.

Im Gegenteil ...

Wenn Sie einen expliziten Konstruktor schreiben, der die Bewegungssemantik verwendet, können Sie unter allen Umständen eine effiziente Lösung erhalten.

So würde I die Klassendefinition ausschreiben:

%Vor%

Wenn Sie diese Klasse verwenden, können Sie entscheiden, wann beide effizienter sind.

Wenn wir zu unseren Beispielen zurückkehren, können wir sie umschreiben, um den besten oder effizientesten Konstruktor zu verwenden:

%Vor%

Niemals einfach davon ausgehen, dass eine Lösung besser ist als alle anderen!

    
CoffeeandCode 30.06.2015 04:47
quelle
3

Ich bin das gewohnt:

%Vor%

Durch die Verwendung der Referenzen wird das Kopieren der Zeichenfolgen in ein neues Objekt auf dem Stapel gespeichert. Es wird nur die Referenz an die vorhandene Zeichenfolge übergeben. Sobald Sie sie den Klassenmitgliedern zuweisen, werden sie kopiert.

    
Martijn Courteaux 05.11.2013 23:17
quelle
0

Wenn Sie const char * beibehalten möchten, wie dies bei den Konstruktoreingabetypen der Fall ist.

%Vor%

Sie können eine std :: string aus einem const char erstellen.

    
Mark Hendrickson 06.11.2013 05:30
quelle

Tags und Links