it-swarm.com.de

Standardwerte in einer Struktur initialisieren

Wenn ich nur einige ausgewählte Werte einer C++ - Struktur initialisieren müsste, wäre dies richtig:

struct foo {
    foo() : a(true), b(true) {}
    bool a;
    bool b;
    bool c;
 } bar;

Bin ich zu Recht davon ausgegangen, dass ich am Ende ein struct Element namens bar mit Elementen bar.a = true, bar.b = true und ein undefiniertes bar.c?

57
Joe Wilcoxson

Ja. bar.a Und bar.b Sind auf true gesetzt, aber bar.c Ist undefiniert. Bestimmte Compiler setzen es jedoch auf false.

Sehen Sie sich hier ein Live-Beispiel an: struct demo

Nach C++ Standard Abschnitt 8.5.12:

wird keine Initialisierung durchgeführt, hat ein Objekt mit automatischer oder dynamischer Speicherdauer einen unbestimmten Wert

Bei primitiven integrierten Datentypen ( bool , char, wchar_t, short, int, long, float, double, long double) nur globale Variablen (alle statischen Speichervariablen) erhalten den Standardwert Null, wenn sie nicht explizit initialisiert werden.

Wenn Sie nicht wirklich wollen, dass undefined bar.c Anfängt, sollten Sie es auch initialisieren, wie Sie es für bar.a Und bar.b Getan haben.

32
taocp

Sie müssen nicht einmal einen Konstruktor definieren

struct foo {
    bool a = true;
    bool b = true;
    bool c;
 } bar;

Zur Verdeutlichung: Diese werden als Klammer- oder Gleichheitsinitialisierer bezeichnet (da Sie anstelle des Gleichheitszeichens auch die Klammerinitialisierung verwenden können). Dies gilt nicht nur für Aggregate: Sie können dies in normalen Klassendefinitionen verwenden. Dies wurde in C++ 11 hinzugefügt.

190
Erik van Velzen

Sie können dies mit einem Konstruktor wie dem folgenden tun:

struct Date
{
int day;
int month;
int year;

Date()
{
    day=0;
    month=0;
    year=0;
}
};

oder so:

struct Date
{
int day;
int month;
int year;

Date():day(0),
       month(0),
       year(0){}
};

In Ihrem Fall ist bar.c undefiniert und sein Wert hängt vom Compiler ab (während a und b auf true gesetzt wurden).

7
Nicola

Eine explizite Standardinitialisierung kann helfen:

struct foo {
    bool a {};
    bool b {};
    bool c {};
 } bar;

Verhalten bool a {} Ist dasselbe wie bool b = bool(); und gibt false zurück.

1
Anamnian