Code: Alles auswählen
class c {
public:
c() : mem() {}
private:
int mem[108];
}
Weiß jemand zufaellligerweise wie es mit anderen Compilern aussieht? Ist meine Interpretation des Standards richtig?
Code: Alles auswählen
class c {
public:
c() : mem() {}
private:
int mem[108];
}
memset bzw. ZeroMemory sollten relativ unabhängig vom Rest funktionieren.
Finde ich eher ungeeignet weil du die Array-Bounds extra angeben musst. Dann doch lieber ein Template a laIch hab immer std::fill genommen, wenn es darum ging, statische Arrays zu initialisieren
Code: Alles auswählen
template <typename T, size_t N>
void clear(T (&b)[N]) {
for (size_t i = 0; i < N; ++i) {
b[i] = T();
}
}
Doch, VC8 (2005) macht alles richtig:ist hätte ich nicht gedacht, dass VC 2005 sie nicht unterstützt
Code: Alles auswählen
#define MYSIZE 4097
class test {
public:
test()
: s()
{}
char s[MYSIZE];
};
int _tmain(int argc, _TCHAR* argv[])
{
test s;
for (size_t i = 0; i < MYSIZE; ++i) {
if (s.s[i]) {
return 1;
}
}
return 0;
}
Das Beispiel funktioniert aber, das Array wird korrekt initialisiert (was nicht der Fall ist wenn ich den Eintrag im der Initialisierungsliste weglasse). default-initialization hiesse laut Standard aber tatsaechlich, dass keine Initialisierung durchgefuehrt wird. Die Hilfeseite zu der Warnung widerspricht dem:warning C4351: new behavior: elements of array 'test::s' will be default initialized
… weshalb ich vermute dass hier zwar default-initialization steht, aber in Wahrheit value-initialization gemeint ist. Die wiederrum ist fuer PODs und skalare Typen, wie auch Arrays aus ihnen, aequivalent zur zero-initialization. Ach, verdammte Begrifflichkeiten.If the array's element type does not have a constructor, the elements of the array will be initialized with the corresponding zero representation for that type.
Ich wäre sogar noch einen Schritt weiter gegangen und hätte einfach ::memset() drübergeknattert, wegen POD.Aramis hat geschrieben:Dann doch lieber ein Template a la … wie von Krishty vermutlich angedacht.
Sauber.Aramis hat geschrieben:Doch, VC8 (2005) macht alles richtig:
Ich habe den Standard nicht hier, aber diese Seite sagt: int (und int[]) ist ein integral type ist ein scalar type ist ein POD type und weiter „Default initialization of a POD object [ein Objekt, das von einem POD type ist] is zero initialization [§8.5, ¶5]“ – ob der Standard erst den Zwischenschritt über den Terminus der value initialization geht, kA – die Warnung ist also korrekt formuliert.Aramis hat geschrieben:… weshalb ich vermute dass hier zwar default-initialization steht, aber in Wahrheit value-initialization gemeint ist. Die wiederrum ist fuer PODs und skalare Typen, wie auch Arrays aus ihnen, aequivalent zur zero-initialization. Ach, verdammte Begrifflichkeiten.
Code: Alles auswählen
int * Uninitd = new int; // Beliebiger Wert (no initialization)
int * Initd = new int(); // 0 (default initialization)
Code: Alles auswählen
int Uninitd; // Beliebiger Wert (no initialization)
int Initd(); // Keine Variable, sondern der Prototyp einer Funktion!
int Initd = int(); // 0 (default initialization)
Code: Alles auswählen
class c {
int mem[108] = {0};
};