Frage zu char*[SIZE]
-
Hallo, in meinem Buch ist folgendes Beispiel:
Wäre es hier nicht besser static const string anstatt static const char* month_tbl zu verwenden.
char*[] ist doch ehr C oder täusche ich mich da?
ostream& operator<<(ostream& os, Month m) { // static const string wäre das nicht besser? static const char* month_tbl[12] = { "January","February","March","April","May","June","July", "August","September","October","November","December" }; return os << month_tbl[m-1]; }#include <iostream> using namespace std; enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dcm }; //------------------------------------------------------------------------------ Month operator++(Month& m) // prefix increment operator { m = (m==dcm) ? jan : Month(m+1); // "wrap around" return m; } //------------------------------------------------------------------------------ ostream& operator<<(ostream& os, Month m) { // static const string wäre das nicht besser? static const char* month_tbl[12] = { "January","February","March","April","May","June","July", "August","September","October","November","December" }; return os << month_tbl[m-1]; } //------------------------------------------------------------------------------ class Vector {}; //int operator+(int,int); // error: you can't overload built-in + Vector operator+(const Vector&, const Vector &); // ok Vector operator+=(const Vector&, int); // ok //------------------------------------------------------------------------------ int main() { Month m = sep; ++m; // m becomes oct ++m; // m becomes nov ++m; // m becomes dec ++m; // m becomes jan ("wrap around") cout << m << endl; return 0; }
-
string hätte keinen Mehrwert, im Gegenteil. Also wozu?
-
Ab und zu sehe ich hier sowas:
char *str = "abc"; cout<<str<<endl;Und in den Antworten steht dann immer: Benutz lieber std::string
Daher dachte ich das dass bei mir jetzt auch so ist.
-
Vielleicht kommt hier gleich einer vorbei und schreibt aus Spaß "Benutz lieber std::string". Machst du das dann?
-
ByteFeld schrieb:
Und in den Antworten steht dann immer: Benutz lieber std::string
Daher dachte ich das dass bei mir jetzt auch so ist.Es ist ein großer Unterschied, ob du char*/string als Variablen oder Konstanten benutzt. Bei Konstanten brauchst du den ganzen Overhead von strings selten (in deinem Fall garnicht), bei Variablen dagegen häufig. Deshalb wird bei Variablen, an denen viele String-Operationen vorgenommen werden, immer davon abgeraten, C-Strings zu nehmen. In deinem Fall bringt die std::string Funktionalität aber keinen Mehrwert.
-
ByteFeld schrieb:
Hallo, in meinem Buch ist folgendes Beispiel:
ostream& operator<<(ostream& os, Month m) { // static const string wäre das nicht besser? static const char* month_tbl[12] = { "January","February","March","April","May","June","July", "August","September","October","November","December" }; return os << month_tbl[m-1]; }Wäre es hier nicht besser static const string anstatt static const char* month_tbl zu verwenden.
Nö. Die std::string-Objekte würden dann beim ersten Durchlauf initialisiert werden. Und bei dieser Initialisierung würde Heap-Speicher reserviert und die Zeichenketten aus dem constanten statischen Speicher in den Heap kopiert. Das ist aber überflüssig, wenn du die Zeichenketten eh nicht ändern willst. Ich würde dem Code nur noch ein extra "const" spendieren, damit das Array selbst konstant wird:
ostream& operator<<(ostream& os, Month m) { static const char* const month_tbl[12] = { "January","February","March","April","May","June","July", "August","September","October","November","December" }; return os << month_tbl[m-1]; }ByteFeld schrieb:
char*[] ist doch ehr C oder täusche ich mich da?
In diesem Fall zeigen die Zeiger auf konstante Arrays im statischen Speicher. Das ist absolut kein Problem. Ein Problem wird es dann, wenn du zur Laufzeit die Zeichenketten ändern willst, so dass sie auf einen anderen String zeigen, den man sich zur Laufzeit zusammenbastelt. Dann hat man nämlich die manuelle Speicherverwaltung an der Backe, wo std::string viel praktischer gewesen wär.