byte_head schrieb:
string vorname = Johannes;
make it so:
xy.h
Code:
#ifndef XY_H
#define XY_H
#include <string>
const std::string vorname = "Johannes";
#endif
Warum das ganze? Abgesehen von evtl. Fehlern durch den fehlenden String-Header bekommt eine normale Variable external Linkage. D.h. wird dieser Header in mehr als einer Übersetzungseinheit (entspricht cpp-File) benutzt hat jede ihre eigene Variable und beim Linken gibt's multiple defined symbols. (one definition rule verletzt)
Eine Konstante dagegen hat erstmal immer internal linkage und daher stellt das kein Problem dar.
Konstanten mit defines zu machen ist absolut schlechter Stil und gehört in kein C++ Programm.
Warum? Defines sind blanke Textersetzungen. Sie haben weder Typ noch halten sich an Scopes. Ihre Bedeutung bekommen sie erst dort wo sie eingesetzt werden. Wenn dabei ein Syntax-Fehler entsteht hat man kaum eine Chance zu erkennen was der Fehler war und darf sich durch kryptische Compilerfehlermeldungen schlagen (der Compiler kann auch keine besseren geben, weil's der Präprozessor bereits versaut hat). Eventuell entsteht auch mal kein Syntaxfehler und man wundert sich nur noch, warum das Programm nicht navollziehbaren Mist anstellt obwohl alles kompiliert. Eine Konstante dagegen ist eine semantische Einheit, die überall die gleiche Bedeutung hat und auch erst vom Compiler - nicht schon vom Präprozessor - ausgewertet wird. Damit kann bei Fehlern auch sinnvoll gewarnt werden.
Genau dafür gibt's Konstanten und Typdefs.
Zu der Sache mit dem Speicherverbrauch. Das ist nichts worum man sich Gedanken machen sollte! Ein halbwegs moderner Linker entfernt ungenutzte Symbole in der Release-Exe. Und auf die paar Bytes kommt es heutzutage wirklich nicht mehr an (es sei denn man hat Spezialfälle wie Embedded Systems, wo's auf jedes Byte ankommt, aber das ist eher exotisch und erstmal recht egal für jemanden der C++ lernt).
@wayne_757: mal ganz kleinlich : das ist ein Double-Literal, kein Float

(sonst 3.5f)
Mal ein bitterböses Beispiel für defines:
Code:
#define int_ptr1 int*
typedef int* int_ptr2;
...
int_ptr1 a, b;
int_ptr2 c, d;
Während Variante 1 einen int* und einen int definiert, macht Variante 2 mit typedef zwei int* draus. Zweiteres erwartet man auch, ersteres ist einfach nur Müll und brandgefährlich. Finger weg von defines in C++ um Konstanten und Typen zu definieren.