Default Initialisierung für alle Variablen
-
Warum gibt es in C++ nicht ein keyword, damit in einer Klasse,Methode/Namespace,Funktion alle uninitialisierten Variablen mit Defaultwerten initialisiert werden?
z.B.defaultinit class Foo { Foo():a(1){}; void bar(){ int m; } int a,b; }; //b und m werden mit 0 initialisiert
-
Dafür gibt es eigentlich schon non-static data member initializers:
class Foo { void bar(){ int m; } int a{}, b{}; }; //b und m werden mit 0 initialisiertZwar nicht ganz genau was du willst, aber ziemlich nah dran:
damit in einer Klasse [...] alle uninitialisierten Variablen mit Defaultwerten initialisiert werden?
Für Namensräume wäre sowas sowieso sinnfrei.
Du verwechselst übrigens die Begriffe. Was du meinst ist value-initialization (und damit für Skalare zero-initialization).
default-initialization heißt für Skalare nämlich gar nichts, wie immer, und das wird im Konstruktor ja standardmäßig ausgeführt.
-
Sone schrieb:
Dafür gibt es eigentlich schon non-static data member initializers:
class Foo { void bar(){ int m; } int a{}, b{}; }; //b und m werden mit 0 initialisiertWarum wird hier m mit 0 initialisiert? Non-static data member initializers sind doch nur für members, oder?
Sone schrieb:
Für Namensräume wäre sowas sowieso sinnfrei.
Ne, alle lokalen Variablen in Namespaces sollen dann auch initialisiert werden.
Ich will dass auch jede lokale Variable in jeder Methode/Funktion initialisiert wird.
-
Idee schrieb:
Ne, alle lokalen Variablen in Namespaces sollen dann auch initialisiert werden.
In Namensräumen gibt es nur globale Variablen, keine lokalen.
Idee schrieb:
Ich will dass auch jede lokale Variable in jeder Methode/Funktion initialisiert wird.
Das muss bei der Initialisierung der entsprechenden Variable getan werden.
Aber du willst sowas nicht kategorisch. Was du brauchst, ist sinnvolle Initialwerte, nicht ständig irgendwelche Defaults. Diese haben nämlich die Tendenz, Logikfehler zu verschleiern.
<
>
-
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
-
Sone schrieb:
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
Ist das erste seit C++11 so?
-
out schrieb:
Sone schrieb:
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
Ist das erste seit C++11 so?
m wird einfach nicht initialisiert, das war für scope-lokale Variablen immer so...

-
out schrieb:
Sone schrieb:
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
Ist das erste seit C++11 so?
Also bei mir hat m einen beliebigen Wert. Mal ist es 0, mal ist es 2284165. Ich schlag mal nach

N3337 schrieb:
To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the
initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.N3337 schrieb:
If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an
object with automatic or dynamic storage duration has indeterminate value.@TE: Objekte werden automatisch mit 0 initialisiert, wenn
- du die Syntax T() nimmst (im Falle von m müsstest du das schreiben:int m=int()... etwas sinnlos, kannst gleich =0schreiben)
- das Objekt im statischen Speicher abgelegt wird.
-
Sone schrieb:
default-initialized.
Sone schrieb:
nicht initialisiert
Und jetzt soll jeder wissen, dass
default-initializedin diesem Fallnicht initialisiertmeint? Was geht nur in deinem Hirn vor. Ich sag nur Pitfall und so.
-
In den Klassen kann man die Objekte so initialisieren:
class Foo { void bar(){ int m; } int a=0, b=0; };m musst du schon selber mit 0 initialisieren. Das kann doch nicht so schwer sein, einfach = 0 anzuhängen.
Ansonsten kannst du auch einen wrapper (Ist das in diesem Kontext das richtige Wort?) schreiben, der die richtigen Variablen abkapselt, sich wie der Originaltyp verhält aber sie immer mit 0 initialisiert.
-
Und jetzt soll jeder wissen, dass default-initialized in diesem Fall nicht initialisiert meint?
Da kann ich nur seufzen. Nein, default-initialized heißt bei Skalaren, das nichts geschieht. Sie werden schon initialisiert - aber eben nur default-initialisiert, was beduetet das eben nichts getan wird. Das ist doch einfach zu verstehen.
Was geht nur in deinem Hirn vor.
Was geht bloß in den Köpfen der Anderen vor, denke ich.
Ich sag nur Pitfall und so.

-
Sone schrieb:
Da kann ich nur seufzen. Nein, default-initialized heißt bei Skalaren, das nichts geschieht. Sie werden schon initialisiert - aber eben nur default-initialisiert, was beduetet das eben nichts getan wird. Das ist doch einfach zu verstehen.
Es ist absolut nicht intuitiv.
Was allgemein als "Default-Wert" für ints bekannt ist, ist 0. Also könnte der unbedarfte C++-Programmierer annehmen, default-initialisiert bedeutet, dass jeder Wert mit 0 initialisiert wird. Das ist logisch und konsistent.
Stattdessen bedeutet default-initialized, dass manchmal mit 0, manchmal mit rand() initialisiert wird. Das ganze ist viel zu kompliziert und ziemlich inkonsistent.
Anstatt dem Standard wie die Bibel zu folgen könntest du auch mal einen Schritt zurücktreten und zugeben, dass das ein ziemliches Wirrwar ist. Historisch gewachsen. C-Kompatibilität und so. Auf jeden Fall nicht intuitiv.
Sie werden schon initialisiert - aber eben nur default-initialisiert, was beduetet das eben nichts getan wird. Das ist doch einfach zu verstehen.
Siehst du, selbst du steigst nicht durch. "Sie werden schon initialisiert" ist eindeutig falsch.
Der Punkt ist, dass "default-initialisiert" ein eigenes Wort ist, das rein gar nichts mit "default" oder "initialisiert" zu tun hat. Nur so kann man den Standard verstehen.
-
Und wie willst du sonst die Semantik zusammenfassen, dass bei Klassen der Default-Konstruktor aufgerufen wird, wobei Skalaren nichts getan wird?
-
Sone schrieb:
Und wie willst du sonst die Semantik zusammenfassen, dass bei Klassen der Default-Konstruktor aufgerufen wird, wobei Skalaren nichts getan wird?
"seltsam"
"nicht-Einsteiger-intuitiv"

-
Sone schrieb:
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
Was soll der Müll? Versuchst du dich mit komischen Halbzitaten rauszureden?
Ich hab geschrieben.
Idee schrieb:
Warum wird hier m mit 0 initialisiert? Non-static data member initializers sind doch nur für members, oder?
Also wird es das nicht.
-
glühbirne schrieb:
Idee schrieb:
Ne, alle lokalen Variablen in Namespaces sollen dann auch initialisiert werden.
In Namensräumen gibt es nur globale Variablen, keine lokalen.
In Namespaces gibt es Funktionen und Klassen mit Methoden mit lokalen Variablen.
Idee schrieb:
Ich will dass auch jede lokale Variable in jeder Methode/Funktion initialisiert wird.
Das muss bei der Initialisierung der entsprechenden Variable getan werden.
Aber du willst sowas nicht kategorisch. Was du brauchst, ist sinnvolle Initialwerte, nicht ständig irgendwelche Defaults. Diese haben nämlich die Tendenz, Logikfehler zu verschleiern.
Du hast nicht ständig irgendwelche Defaults, sondern nur, wenn die Variable jetzt nicht initialisiert wird. Nicht initialisierte Variablen verursachen Bugs, die nur manchmal auftreten und schwer zu finden sind.
Man könnte auch irgendwelche komischen Werte als Defaultwerte nehmen, so wie es manche Debugger machen, dann findet man die Bugs auch schneller.
-
Idee schrieb:
Du hast nicht ständig irgendwelche Defaults, sondern nur, wenn die Variable jetzt nicht initialisiert wird. Nicht initialisierte Variablen verursachen Bugs, die nur manchmal auftreten und schwer zu finden sind.
Man könnte auch irgendwelche komischen Werte als Defaultwerte nehmen, so wie es manche Debugger machen, dann findet man die Bugs auch schneller.
Nichts einfacher als das: Definiere erst Variablen, wenn du sie auch mit einem Wert belegen kannst.
-
Idee schrieb:
Du hast nicht ständig irgendwelche Defaults, sondern nur, wenn die Variable jetzt nicht initialisiert wird. Nicht initialisierte Variablen verursachen Bugs, die nur manchmal auftreten und schwer zu finden sind.
Super
. Laufzeitkosten um vermeintliche Anfängerprogrammierfehler abzufangen, die, wenn Fortgeschrittene sie machen, dann doch keine sind, sondern eine bewusste Entscheidung des Programmierers. Um welche Sprache geht es? Basic? Java?
-
Idee schrieb:
Sone schrieb:
Non-static data member initializers sind doch nur für members, oder?
Natürlich, m wird default-initialized.
Was soll der Müll? Versuchst du dich mit komischen Halbzitaten rauszureden?
Mit solch einem Choleriker werde ich nicht diskutieren. Ich sehe auch nicht ein, wieso deine Aussage irgendwie von dem ersten Satz abhängt...
Ich hab geschrieben.
Idee schrieb:
Warum wird hier m mit 0 initialisiert? Non-static data member initializers sind doch nur für members, oder?
Also wird es das nicht.
Doch, m wird - als scope-lokale Variable - default-initialized. Wie du eigentlich schon wissen solltest, würdest du mal alle Posts lesen. Das sie den Wert 0 hat, liegt wohl am Debug-Modus deines Compilers (da wird der Stack vllt. ausgenullt).
-
SeppJ schrieb:
Idee schrieb:
Du hast nicht ständig irgendwelche Defaults, sondern nur, wenn die Variable jetzt nicht initialisiert wird. Nicht initialisierte Variablen verursachen Bugs, die nur manchmal auftreten und schwer zu finden sind.
Super
. Laufzeitkosten um vermeintliche Anfängerprogrammierfehler abzufangen, die, wenn Fortgeschrittene sie machen, dann doch keine sind, sondern eine bewusste Entscheidung des Programmierers. Um welche Sprache geht es? Basic? Java?Das kann man zu compilezeit machen.
Ich hab geschrieben, dass man es mit einem keyword einschaltet.Aber vergesst es. Irgendjemand will was an C++ ändern. Das brauchen wir Profis nicht, wir machen nie Flüchtigkeitsfehler.

Idiotenhaufen.