Heim >Backend-Entwicklung >C++ >Warum werden statische C-Membervariablen außerhalb der Klassendefinition initialisiert?

Warum werden statische C-Membervariablen außerhalb der Klassendefinition initialisiert?

DDD
DDDOriginal
2024-12-03 18:11:23497Durchsuche

Why are C   Static Member Variables Initialized Outside the Class Definition?

Initialisierung statischer Mitgliedsvariablen in C

In C werden statische Mitgliedsvariablen außerhalb der Klassendefinition initialisiert. Diese Entwurfswahl hat Fragen hinsichtlich ihrer logischen Begründung und möglichen Auswirkungen auf das Erbe aufgeworfen.

Grund für die externe Initialisierung

Statische Elemente müssen in genau einer Übersetzungseinheit definiert werden, um eingehalten zu werden die Ein-Definition-Regel. Wenn die Initialisierung innerhalb der Klasse zulässig wäre, könnten mehrere Definitionen in verschiedenen Übersetzungseinheiten entstehen, in denen die Header-Datei enthalten ist.

Beispiel

Bedenken Sie den folgenden Codeausschnitt:

struct Gizmo
{
  static string name = "Foo";
};

Wenn der Name innerhalb der Klasse initialisiert werden würde, würde er in jeder Übersetzungseinheit definiert, die die Header-Datei enthält. Dies würde gegen die One-Definition-Regel verstoßen.

Integrierte statische Mitglieder

C ermöglicht die Initialisierung integraler statischer Mitglieder innerhalb der Deklaration. Allerdings ist immer noch eine externe Definition innerhalb einer einzelnen Übersetzungseinheit erforderlich, um die Ein-Definition-Regel zu erfüllen. Dies dient als syntaktische Abkürzung:

struct Gizmo
{
  static const int count = 42;
};

Solange der bei der Initialisierung verwendete Ausdruck vom Typ const integral oder enumeration ist, zur Kompilierungszeit ausgewertet werden kann und eine Definition in einer einzelnen Übersetzungseinheit vorhanden ist, Dieser Ansatz ist gültig. Zum Beispiel:

gizmo.cpp

#include "gizmo.h"

const int Gizmo::count;

Das obige ist der detaillierte Inhalt vonWarum werden statische C-Membervariablen außerhalb der Klassendefinition initialisiert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn