Ich habe das struct
:
struct Snapshot
{
double x;
int y;
};
Ich möchte x
und y
soll 0 sein. Werden sie standardmäßig 0 sein oder muss ich Folgendes tun:
Snapshot s = {0,0};
Was sind die anderen Möglichkeiten, um die Struktur auf Null zu setzen?
Antworten:
Sie sind nicht null, wenn Sie die Struktur nicht initialisieren.
Der zweite macht alle Mitglieder auf Null, der erste lässt sie bei nicht spezifizierten Werten. Beachten Sie, dass es rekursiv ist:
Der zweite wird
p.s.{x,y}
Null machen . Sie können diese aggregierten Initialisierungslisten nicht verwenden, wenn Ihre Struktur Konstruktoren enthält. In diesem Fall müssen Sie diesen Konstruktoren eine ordnungsgemäße Initialisierung hinzufügenInitialisiert sowohl x als auch y auf 0. Beachten Sie, dass Sie
x(), y()
sie unabhängig von ihrem Typ initialisieren können: Dies ist dann die Wertinitialisierung und ergibt normalerweise einen korrekten Anfangswert (0 für int, 0.0 für double, wobei der Standardkonstruktor für benutzerdefiniert aufgerufen wird Typen, die vom Benutzer deklarierte Konstruktoren haben, ...). Dies ist besonders wichtig, wenn Ihre Struktur eine Vorlage ist.quelle
Snapshot s = {};
für Nicht-POD-Mitglieder (um sie auf Null zu setzen )?Nein, sie sind standardmäßig nicht 0. Der einfachste Weg, um sicherzustellen, dass alle Werte oder standardmäßig 0 sind, besteht darin, einen Konstruktor zu definieren
Dadurch wird sichergestellt, dass alle Verwendungen von Snapshot initialisierte Werte haben.
quelle
Im Allgemeinen nein. Eine als Dateibereich oder statisch in einer Funktion deklarierte Struktur wird jedoch auf 0 initialisiert (genau wie alle anderen Variablen dieser Bereiche):
quelle
Mit POD können Sie auch schreiben
Sie sollten memset in C ++ nicht verwenden, memset hat den Nachteil, dass ein Nicht-POD in der Struktur zerstört wird.
oder so:
quelle
SomeType foo();
ist das typische, obwohl es bei anderen passieren kann - in Funktionsdefinitionen (in diesem Fall eine Funktionfoo
, die zurückgibtSomeType
). Entschuldigung für den Nekro, aber wenn jemand anderes darüber stolpert, würde ich antworten.Verwenden Sie in C ++ Konstruktoren ohne Argumente. In C können Sie keine Konstruktoren haben, verwenden Sie also entweder
memset
oder - die interessante Lösung - bestimmte Initialisierer:quelle
Ich glaube, die richtige Antwort ist, dass ihre Werte undefiniert sind. Oft werden sie beim Ausführen von Debug-Versionen des Codes auf 0 initialisiert. Dies ist normalerweise nicht der Fall, wenn Release-Versionen ausgeführt werden.
quelle
0
an diesen Stellen im Speicher. Dies ist nicht dasselbe wie Initialisierung!Da dies ein POD (im Wesentlichen eine C-Struktur) ist, schadet es wenig, ihn auf C-Weise zu initialisieren:
oder ähnlich
Ich würde jedoch nicht so weit gehen, es
calloc()
in einem C ++ - Programm zu verwenden.quelle
Verschieben Sie Pod-Mitglieder in eine Basisklasse, um Ihre Initialisierungsliste zu verkürzen:
quelle