HOWTO · C++

Initialisierung von C++-Struct-Standardwerten

Die Klammer-oder-Gleich-Initialisierer werden verwendet, um die Standardwerte in einer Struktur in C++ zu initialisieren.

Auf dieser Seite

Einen Standardwert für ein Member deklarieren Sie innerhalb der struct-Definition mit einem Brace-or-Equal-Initializer, zum Beispiel int age = 30;. Ein Objekt verwendet diesen Wert, wenn bei seiner Erstellung kein anderer Initialisierer für das Member angegeben wird. Ein Konstruktor kann in seiner Member-Initialisierungsliste einen objektspezifischen Wert festlegen, während andere Member weiterhin ihre deklarierten Standardwerte verwenden.

Wirkung von Standard-Member-Initialisierern

Ein Standard-Member-Initialisierer wird einem Datenmember in der Typdefinition zugewiesen. Er gibt dem Member während der Konstruktion einen Wert, wenn der Konstruktor es nicht ausdrücklich initialisiert. So kann ein einfacher Datentyp sinnvolle Standardwerte bereitstellen, ohne einen Konstruktor hinzuzufügen, dessen einziger Zweck darin besteht, diese Werte zuzuweisen.

Der Initialisierer greift immer dann, wenn das Member bei der Konstruktion seinen Standardwert erhält. Er zwingt nicht jedes Objekt zu demselben Wert: Ein Konstruktor kann für ein bestimmtes Objekt einen anderen Wert wählen. Ein Standard-Member-Initialisierer ist Teil der Initialisierung und keine Zuweisung, die erst nach dem Erstellen des Objekts ausgeführt wird. Member ohne Standard-Member-Initialisierer müssen durch den Konstruktor oder eine andere passende Initialisierungsform initialisiert werden, bevor ihre Werte gelesen werden.

Standard-Member-Initialisierer festlegen

Schreiben Sie jeden Initialisierer in die Memberdeklaration innerhalb der geschweiften Klammern der struct. C++ erlaubt sowohl einen Initialisierer mit Gleichheitszeichen, etwa int age = 30;, als auch einen Initialisierer in geschweiften Klammern, etwa int age{30};. Wählen Sie die Form, die zum Typ des Members und zu Ihrem Stil passt, und beenden Sie jede Deklaration mit einem Semikolon.

Auf die schließende Klammer der struct-Definition folgt ein Semikolon. Setzen Sie kein Komma hinter die letzte Memberdeklaration. Diese Satzzeichen gehören zu unterschiedlichen Teilen der Definition: Memberdeklarationen enden mit Semikolons, die Typdefinition mit };.

Standardwerte beim Erzeugen eines Objekts überschreiben

Initialisiert ein Konstruktor ein Member in seiner Member-Initialisierungsliste, wird für dieses Objekt dieser Wert statt des deklarierten Standardwerts verwendet. Die Initialisierungsliste nennt die Member nach dem Doppelpunkt des Konstruktors, zum Beispiel explicit Person(int a) : age(a) {}. Member, die in der Liste nicht aufgeführt sind, können weiterhin ihre Standard-Member-Initialisierer verwenden.

Das ist nützlich, wenn die meisten Objekte sinnvolle Standardwerte haben sollen, einige aber Werte aus einer Eingabe oder dem Anwendungszustand benötigen. Ein Konstruktor sollte die Member initialisieren, deren Werte von seinen Parametern abhängen; für andere Member bleiben die Standardwerte hilfreich. Wenn bei der Konstruktion immer jedes Member angegeben wird, sind Standardwerte möglicherweise unnötig. Sie können dennoch andere Formen der Konstruktion unterstützen, bei denen ein Member seinen Standardwert erhält.

Regeln und ein vollständiges Beispiel

Eine C++-struct ist ein Typ, dessen Member und Basisklassen standardmäßig öffentlich sind; aus diesem Typ werden weiterhin Objekte erstellt. Eine struct kann außerdem Memberfunktionen enthalten und an einer Vererbung teilnehmen. Diese Eigenschaften ändern nichts daran, wie Member-Standardwerte funktionieren: Der Standardwert wird zusammen mit dem Member deklariert, und ein Wert aus der Konstruktor-Initialisierungsliste hat Vorrang für das Member, das er initialisiert.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

#include <iostream>
#include <string>

struct Person {
    std::string name = "John Doe";
    int age = 30;

    Person() = default;
    explicit Person(int a) : age(a) {}
};

int main() {
    Person defaultPerson;
    Person namedPerson(25);

    std::cout << defaultPerson.name << ", " << defaultPerson.age << '\n';
    std::cout << namedPerson.name << ", " << namedPerson.age << '\n';
}
John Doe, 30
John Doe, 25

Im bereitgestellten erfolgreichen Lauf verwendet das erste Objekt beide deklarierten Standardwerte; das zweite erhält age mit dem Wert 25 aus seinem Konstruktor, während sein name den deklarierten Standardwert behält. Beide Ausgabezeilen zeigen den Namen „John Doe“ auf Englisch; der angezeigte Name wurde also nicht übersetzt.