K
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.