Ich glaube du meinst
Warum impliziert const eine interne Verknüpfung in C ++?
Wenn Sie ein const-Objekt im Namespace-Bereich deklarieren, verfügt es zwar über eine interne Verknüpfung.
Anhang C ( C ++ 11, C.1.2 ) gibt die Begründung
Änderung: Ein Name des Dateibereichs, der explizit als const und nicht explizit als extern deklariert ist, hat eine interne Verknüpfung, während er in C eine externe Verknüpfung hätte
Begründung: Da const-Objekte in C ++ als Werte zur Kompilierungszeit verwendet werden können, fordert diese Funktion Programmierer auf, explizite Initialisierungswerte für jede const anzugeben. Mit dieser Funktion kann der Benutzer const-Objekte in Header-Dateien einfügen, die in vielen Kompilierungseinheiten enthalten sind.
Wie bereits erwähnt, sind
const
Objekte in C ++ intern verknüpft. Dies liegt daran, dass sie wie folgt verwendet werden sollen:quelle
Const und Static sind orthogonale Konzepte in C und C ++.
Das
const
Schlüsselwort weist den Compiler an, zu verhindern, dass die Variable als Wert eines Ausdrucks angezeigt wird, sodass sie im Wesentlichen schreibgeschützt ist.In C hat das
static
Schlüsselwort je nach Anwendung mehrere Verwendungszwecke. Wenn es auf eine Variable einer Funktion angewendet wird, bedeutet dies, dass die Variable nicht im lokalen Bereich einer Funktion gespeichert ist, sondern über Aufrufe derselben zugänglich ist. Wenn es auf eine globale Variable oder Funktion angewendet wird, ist es nur für eine bestimmte Datei zugänglich - mit anderen Worten, es ist nur innerhalb der Kompilierungseinheit zugänglich (sofern nicht deklariertextern
).In C ++, das
static
kann Schlüsselwort innerhalb einer Klassendefinition verwendet werden, eine Variable oder Funktionen zu machen , geteilt in allen Instanzen der Klasse, anstatt für jede Instanz lokal zu sein. Darüber hinaus kann eine statische Klassenfunktion in C ++ nur auf statische Variablen dieser Klasse (oder auf Klassen, auf die sie Zugriff hat) zugreifen. In C ++ werdenconst
Mitglieder nun intern mit der Kompilierungseinheit verknüpft, sofern sie nicht ausdrücklich deklariert sind.extern
Dies ist möglicherweise das, worauf Sie verweisen. Auf diese Weise können Konstanten zur Kompilierungszeit mithilfe von Header-Dateien geräteübergreifend gemeinsam genutzt werden. Beachten Sie jedoch, dass die Mitglieder nicht wirklich statisch sind - vielmehr wird die Konstante an jedem Ort kompiliert, an dem sie referenziert wird.quelle
In C & C ++ hat der Begriff statisch mehrere Bedeutungen (er kann die Verknüpfung und Speicherung regeln). Sie müssen Stroustrups D & E lesen, um seine Begründung zu verstehen. Wenn Sie jedoch eine Variable im Namespace-Bereich als const deklarieren, hat sie automatisch eine interne Verknüpfung In C müssen Sie es als statisch deklarieren, um eine interne Verknüpfung zu erzwingen.
Natürlich ist in C ++ die Verwendung von Static zur Steuerung der Verknüpfung veraltet. Anonyme Namespaces können zur Simulation der internen Verknüpfung in C ++ verwendet werden.
const-Variablen in C ++ sollten Präprozessorkonstanten ersetzen - und da Präprozessorkonstanten nur in Dateien sichtbar sind, die sie definieren, macht const die Variable automatisch nur in der Datei sichtbar, die sie definiert.
quelle
Diese Konzepte sind orthogonal und sollten nicht als dasselbe gedacht werden.
Konstanz ist eine Zugriffseigenschaft: Sie gibt nur an, ob Ihre Variable schreibgeschützt (const) oder schreibgeschützt (nicht const) sein soll.
Statizität ist eine lebenslange (und technisch speicherlokalisierende) Eigenschaft: Sie gibt an, ob die Variable im Bereich einer Klasse (in einer Klasse) oder einer Übersetzungseinheit (in Verbindung mit einer in cpp definierten globalen Variablen) global ist. .
quelle
Dies ist nicht der Fall, und das offensichtlichste Beispiel ist, dass eine const-Membervariable (die natürlich vom Konstruktor initialisiert wird) nicht von allen Objekten dieser Klasse gemeinsam genutzt wird, sondern für jedes Objekt individuell ist.
litb gibt oben die beste Antwort.
quelle
Das tut es nicht. Folgendes schreiben:
macht nicht
i
statisch (weder in C noch in C ++).quelle