Test(int i) : i(i) //hä?
-
Falls dich lediglich das i(i) verwirren sollte.
nennen wir es i1(i2)
i1 muss eine Elementvariable (oder auch Elementfunktion) sein. Denn es steht in der Initliste. Und dort dürfen nur Elemente der Klasse stehen.
i2 kann auch ein Element sein, aber auch ein Argument (dass übergeben wurde). Und das Argument hat die 'höhere Priorität' wenn man so sagen will. i2 überdeckt somit i1.
Deshalb wäre ein
i=i;
im Ctor fehlerhaft, weil es beidemale i2 wäre (i2 hat ja höhere Priorität).
this->i=i;
wäre das Äquivalente.
-
@Shade Of Mine: Das nennst du verständlich erklären?
-
Danke für eure Antworten.
Damit ich das richtig verstehe:
Wenn ich in der main
Test a(3)
schreiben würde, dann hieße das, das
Test( 3 ) : i (3)
sei, also i = 3? Der Doppelpunkt dazwischen bedeutet: alles was rechts vom Doppelpunkt steht, wird initialiert??
-
Hi,
dann hieße das, das
Test( 3 ) : i (3)
sei, also i = 3? Der Doppelpunkt dazwischen bedeutet: alles was rechts vom Doppelpunkt steht, wird initialiert??
Für den Aufruf gilt das, genau.
Falls dir Freude am wahren Wort liegt übrigens: initialisiertMfG Eisflamme
-
Ein größeres Beispiel zeigt dir die Verwendung der Init-Liste auch bei mehreren Member-Variablen (hier konstante Geburtsdaten einer Person):
#include <iostream> #include <iomanip> #include <conio.h> #include <string> #include <sstream> using namespace std; class Person { private: const unsigned d_; const unsigned m_; const unsigned y_; public: Person(unsigned d, unsigned m, unsigned y); const string getBirthday() const; }; Person::Person(unsigned d, unsigned m, unsigned y):d_(d),m_(m),y_(y){} const string Person::getBirthday() const { stringstream sstream; sstream<<setfill('0') << setw(2) << d_ << "." << setw(2) << m_ << "." << setw(2) << y_ ; return sstream.str(); } int main() { Person A(12,1,1953), B(3,11,1981); cout << A.getBirthday() << endl << B.getBirthday() <<endl; getch(); }
-
die initialisierer sollen auch in der reichenfolge geschrieben werden, wie die variablen deklariert wurden. sonst meckern einige compiler
-
bzw. das Problem ist dabei folgendes: Die Elemente werden leider in der Reihenfolge initialisiert, wie sie in der Klasse stehen und nicht, wie sie in der Liste dann stehen.
Wenn ich b in Abhängigkeit von a initialisieren will, muss ich verflucht aufpassen, dass a auch wirklich zuerst initialisiert wird. Ich glaube, mein Compiler gibt da keine Warnung aus.
-
Erhard Henkes schrieb:
Ein größeres Beispiel zeigt dir die Verwendung der Init-Liste auch bei mehreren Member-Variablen (hier konstante Geburtsdaten einer Person):
Ok, soweit habe ich das Bsp. verstanden.
const string getBirthday() const;
bedeutet das, dass getBirthday() einen konstanten String zurückliefert, aber was bewirkt das zweite const??
-
Das ist ne Garantie dafür, dass diese Methode nix an dem Objekt verändert.
-
Optimizer schrieb:
bzw. das Problem ist dabei folgendes: Die Elemente werden leider in der Reihenfolge initialisiert, wie sie in der Klasse stehen und nicht, wie sie in der Liste dann stehen.
Wenn ich b in Abhängigkeit von a initialisieren will, muss ich verflucht aufpassen, dass a auch wirklich zuerst initialisiert wird. Ich glaube, mein Compiler gibt da keine Warnung aus.
Der gcc meldet folgendes:
Warning: 'Foo::Bar' will be initialized after `int Foo::Bar2'