Initialisierungsliste
-
Hallo zusammen
Mein Problem ist folgender Art. Ich begreiffe nicht ganz wieso Der Konstruktor StudentId zweimal erstellt also das Objekt id. Es steht einmal bei protected und einmal wird es vom Studentkonstruktor aufgerufen ist das korrekt?
Und wieso man dann eine Initialisierungsliste benötigt ist mir auch nicht ganz klar xDint nextStudentId = 1000; class StudentId { publi StudentId() { value = nextStudentId++; cout << "Naechste Studenten-ID " << value << " zuweisen" << endl; } StudentId(int id) { value = id; cout << "Studenten-ID " << value << " zuweisen" << endl; } ~StudentId(){cout << "zerstoere " << value << endl;} protected: int value; }; class Student { public: Student(const char *pName, int ssId) { cout << "Erzeuge Student " << pName << endl; name = pName; StudentId id(ssId); } protected: string name; StudentId id; }; int main(int argcs, char* pArgs[]) { Student s("Chester", 1234); ...Danke für Eure Hilfe

-
Der Konstruktor von StudentId wird einmal aufgerufen für das proteted-Memberobjekt von Student. Da Student keine Initialisierungsliste hat, wird der Standardkonstruktor genommen. Weiterhin wird im Konstruktor von Student ein weiteres lokales StudentId-Objekt namens id erstellt, mit dem Argument ssId.
Dieses Objekt hat rein gar nichts mit dem Memberobjekt id zu tun
und wird bei Verlassen des Student-Konstruktors sofort wieder zerstört.Und jetzt verstehst du hoffentlich auch den Sinn von Initialisierungslisten.
-
k ja alles kapiert
und wieso wird das objekt id das mit dem standardkonstruktor von Stundent erstellt wurde lokal abgespeichert? weil das andere schon den Namen belegt hat ?
-
airglide schrieb:
k ja alles kapiert
und wieso wird das objekt id das mit dem standardkonstruktor von Stundent erstellt wurde lokal abgespeichert? weil das andere schon den Namen belegt hat ?
Weil du es lokal erstellst:class Student { public: Student(const char *pName, int ssId) { int foo; // Lokaler int namens "foo" name = "Mustermann"; // Memberobjekt "name" wird Wert zugewiesen double name; // Lokaler double namens "name". Überdeckt Student::name. name = 3.13; // Lokalem "name" wird Wert zugewiesen Student::name="Normalverbraucher"; // Memberobjekt wird Wert zugewiesen StudentId id(ssId); // Lokale StudentId id. Überdeckt Student::id. } protected: string name; StudentId id; };Du kannst in einem Gültigkeitsbereich immer Objekte mit Namen aus höheren Gültigkeitsbereichen erstellen, die überdecken dann die höheren Namen.
edit: Und außerdem solltest du immer mit höchsten Warnstufen compilieren, dann hättest du eine Warnung von wegen unbenutzter variablen bekommen.
-
ah k
alles klar danke