Klassenstring-Konstanten in C ++ definieren?
Habe ich gesehen-code, um mit diesen beiden Stilen , ich bin nicht nicht sicher, ob eine besser als die andere (ist es nur noch eine Frage von Stil)? Hast du irgendwelche Empfehlungen, warum würden Sie wählen eine über die andere.
//Example1
class Test {
private:
static const char* const str;
};
const char* const Test::str = "mystr";
//Example2
class Test {
private:
static const std::string str;
};
const std::string Test::str ="mystr";
Kommentar zu dem Problem
wie ist das zu stören?
InformationsquelleAutor der Frage kal | 2009-01-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel sollten Sie lieber
std::string
über plain char-Zeigern. Hier ist jedoch an die char-Zeiger Initialisierung mit string-literal hat einen wichtigen Vorteil.Gibt es zwei Initialisierungen für statische Daten. Die eine wird als statische Initialisierung, und das andere ist das sogenannte dynamische Initialisierung. Für diejenigen Objekte, die initialisiert werden mit konstanter Ausdrücke und die Hülsen (wie Zeiger), C++ erfordert, dass Ihre Initialisierung geschieht ganz am Anfang, vor der dynamischen Initialisierung passiert. Initialisieren wie ein std::string erfolgt dynamisch.
Wenn Sie ein Objekt einer Klasse wird ein statisches Objekt in eine Datei, und man braucht zum Zugriff auf den string, die während der Initialisierung, können Sie sich darauf verlassen, dass die set-up schon, wenn Sie die
const char* const
version, während der Verwendung derstd::string
version, und die ist nicht statisch initialisiert, Sie können nicht wissen, ob der string bereits initialisiert - da die Reihenfolge der Initialisierung der Objekte auf die übersetzungseinheit Grenzen nicht definiert ist.InformationsquelleAutor der Antwort Johannes Schaub - litb
Hmmm, ein std::string ist nicht das gleiche wie ein const char *. I Regel irren auf der Seite der Verwendung von std::string, weil es ist eine Klasse, die hat viele zusätzliche Funktionen, die es machen, viel einfacher zu bedienen.
Wenn die Leistung ist von größter Bedeutung und Sie werden mit const char * für die Effizienz, die diesen Weg gehen.
InformationsquelleAutor der Antwort Starkii
Ich eher zu Gunsten std::string s über char *'s, wenn dabei C++. Ich bevorzuge std::string vor allem für seine integrierten Funktionen sowie Komfort und Sicherheit nicht für den Umgang mit Zeigern.
Jedoch, wie andere erwähnt haben, die const char * version kann es günstig sein, wenn Sie übermäßig besorgt über die Leistung. Ich scheine zu erinnern, dass jemand smart einmal fest, dass die vorzeitige Optimierung ist die Wurzel allen übels (oder so). 🙂
InformationsquelleAutor der Antwort goku3989
Ersten Beispiel erfordert weniger Aufwand für die Verwaltung der Zeichenfolge (D. H., nur ein Zeiger auf die TEXT-Abschnitt). Auch die zweite Methode erfordert einen heap-Allokation sowie das kopieren der string-literal std:string-Klasse buffer. Also, Sie würde am Ende mit zwei Kopien der Daten.
InformationsquelleAutor der Antwort Judge Maygarden
In großen Projekten, an denen mehrere Plattformen mit unterschiedlichen Compilern und Bibliotheken, viele teams, und viele Leute haben wir immer wieder Probleme mit static std::strings. Auf einigen Plattformen die std:string Implementierung ist nicht thread-sicher. Auf einer Plattform, die der compiler optimiert code übersprungen initialisieren einer lokalen std:string form der globalen static const. Nach der Jagd ein paar dieser Probleme, die wir nur zulassen, dass Globale statische consts für eingebaute Typen.
InformationsquelleAutor der Antwort maccullt
Die zweite version hat den Vorteil, dass es kommt mit einer pre-berechnet Länge und die weiteren Vorteile eines konkretisiert string-Klasse. Das erste hat den Vorteil, dass nur die Initialisierung ist nur die Zuordnung einen Zeiger auf statische Daten, die bereits geladen in die ausführbare Datei ein Bild, wo das zweite hat zum initialisieren Sie die Zeichenfolge aus, die gleichen Zeiger.
InformationsquelleAutor der Antwort Eclipse
Erste von allen, wenn Sie nicht einen char*. Wenn Sie möchten, eine ASCIIZ-Zeichenfolge definieren, die Sie direkt:
const char Test::str[] = "mystr";
Für die meisten Teil, das ist, was ich verwenden würde. Warum verschwenden Zeit und Speicher für den overhead der string-Klasse.
Beachten Sie, dass "sizeof(Test::str)" wird korrekt geben Sie die Länge des Arrays, die die Länge der Zeichenfolge, einschließlich des abschließenden NUL - (strlen(str)+1).
InformationsquelleAutor der Antwort James Curran