Initialiserungsliste
-
Es gibt einen wesentlichen Unterschied zwischen Initialisierung und Zuweisung. Initialisieren bedeutet eben, dass das Objekt bereits mit einem bestimmten Wert erzeugt wird. Bei einer Zuweisung dagegen wird einem bereits erzeugten Objekt ein neuer Wert zugewiesen. Wenn du dir das jetzt immer nur anhand der Bits eines einzelnen int überlegst, wirkt es vielleicht so, als wär das alles irgendwie das Gleiche. Wenn du statt int aber mal einen beliebigen Typ nimmst, z.B. irgendeine Klasse, dann macht es einen riesen Unterschied. Eine Klasse könnte z.B. überhaupt nur Initialisierung, aber keine Zuweisung unterstützen...
-
Ich glaube ich verstehe was du meinst. Aber um sicher zu gehen:
int main() { int x = 0; // Definition mit Initialisierung int y; // Definition y = 0; // Zuweisung }Ist das korrekt? Stimmt es, dass eine Initialisierung nur zusammen mit einer Definition auftreten kann?
-
icarus2 schrieb:
Ist das korrekt?
Ja
icarus2 schrieb:
Stimmt es, dass eine Initialisierung nur zusammen mit einer Definition auftreten kann?
Nicht ganz. Bei einem Klassenmember erfolgt die Initialisierung in der Initialisierungsliste des Konstruktors. Aber bei lokalen Variablen ja.
-
dot schrieb:
icarus2 schrieb:
Stimmt es, dass eine Initialisierung nur zusammen mit einer Definition auftreten kann?
Nicht ganz. Bei einem Klassenmember erfolgt die Initialisierung in der Initialisierungsliste des Konstruktors. Aber bei lokalen Variablen ja.
Ja, ich meinte bei lokalen Variablen. Haette ich klar schreiben sollen.
Vielen Dank

-
Gugelmoser schrieb:
Was versteht ihr also unter später initialisiern?
Ich meine nicht unbedingt "initialisieren" im Sinn des C++ Standard, sondern einfach ... naja ... "initialisieren" halt

Und wenn man den Standard mal aussen vor lässt, dann ist IMO die erste Zuweisung eines POD Typs seine Initialisierung. Bzw. ich finde es einfach sinnvoll es so zu nennen.
-
Nana, wir sollten schon versuchen bei der Terminologie zu bleiben, die der Standard nutzt. Das schützt z.B. vor Missverständnissen.

-
dot schrieb:
Initialisieren bedeutet eben, dass das Objekt bereits mit einem bestimmten Wert erzeugt wird.
dot schrieb:
icarus2 schrieb:
Stimmt es, dass eine Initialisierung nur zusammen mit einer Definition auftreten kann?
Nicht ganz.
Jetzt hast du aber auch ein Widerspruch gebaut. Wenn du etwas erzeugst, dann ist es doch definiert. Icarus2s Aussage ist absolut richtig: Eine Initialisierung impliziert immter eine Definition.
Und wenn man Objekte nur als Ganzes mit einem Zustand betrachtet, dann kann man sie praktisch sowieso nur initialisiern:
class Wohnort { private: string strasse; string hnr; string plz; string ort; public: Wohnort() { strasse = "Musterstrasse"; hnr = "1"; plz = "0815"; ort = "Musterort"; } }; int main() { Wohnort ort; // Man hat das Objekt mit einem bestimmten Zustand (Musterstrasse 1, 0815 Musterort) erzeugt. Also hat man das Objekt initialisiert (wenn man es als Ganzes betrachtet). }Daraus lässt sich nun ableiten, dass Konstruktoren Objekte immer initialisieren, nämlich mit einem bestimmten Zustand.
-
Schlechtes Beispiel.
class A { int i_; public: A() { i_ = 3; } }; int main() { A a; }a wurde initialisiert, i_ nicht.
-
cooky451 schrieb:
Schlechtes Beispiel.
class A { int i_; public: A() { i_ = 3; } }; int main() { A a; }a wurde initialisiert, i_ nicht.
Ich sehe da jetzt gerade keinen Widersrpuch zu meinen Aussuagen. Oder wolltest du das damit gar keinen Widerspruch andeuten? :p
-
Gugelmoser schrieb:
Und wenn man Objekte nur als Ganzes mit einem Zustand betrachtet, dann kann man sie praktisch sowieso nur initialisiern:
class Wohnort { private: string strasse; string hnr; string plz; string ort; public: Wohnort() { // an diesen Punkt sind die Membervariable mit demm Standardkonstruktur initialisiert, // deswegen sind die nachfolgende Statements Zuweisungen! strasse = "Musterstrasse"; hnr = "1"; plz = "0815"; ort = "Musterort"; } }; int main() { Wohnort ort; // Man hat das Objekt mit einem bestimmten Zustand (Musterstrasse 1, 0815 Musterort) erzeugt. Also hat man das Objekt initialisiert (wenn man es als Ganzes betrachtet). }Daraus lässt sich nun ableiten, dass Konstruktoren Objekte immer initialisieren, nämlich mit einem bestimmten Zustand.
-
Was dot meinte war nicht, dass man initialisieren kann ohne zu definieren, sondern dass es anders aussehen kann als "int i = 1;". (Initialisierungsliste)
-
Zeus schrieb:
...
Ich kenne keine Attribute nicht. Und wenn ich keine Attrubute kenne, kann ich auch keine Aussage darüber machen. Darum hatte ich geschrieben, wenn man das Objekt als Ganzes nur mit Zustand betrachtet. Und ein Objekt hat immer einen Zustand.
cooky451 schrieb:
Was dot meinte war nicht, dass man initialisieren kann ohne zu definieren, sondern dass es anders aussehen kann als "int i = 1;". (Initialisierungsliste)
Aso, ok, einverstanden.

-
Gugelmoser schrieb:
Zeus schrieb:
...
Ich kenne keine Attribute nicht. Und wenn ich keine Attrubute kenne, kann ich auch keine Aussage darüber machen. Darum hatte ich geschrieben, wenn man das Objekt als Ganzes nur mit Zustand betrachtet. Und ein Objekt hat immer einen Zustand.
Bis auf dem letzen Satz versteh ich dich nicht. Ein Funktor hat ein Zustand? Oder ist ein Funktor kein Objekt? Oder zählst du sein assoziereten Stackzustand als Seinen? Fragen über Fragen!
-
Zeus schrieb:
// an diesen Punkt sind die Membervariable mit demm Standardkonstruktur initialisiert, // deswegen sind die nachfolgende Statements Zuweisungen!Es wären auch Zuweisungen, wenn die Objekte keinen Konstruktor hätten. :p
-
Zeus schrieb:
Ein Funktor hat ein Zustand? Oder ist ein Funktor kein Objekt?
Klar ist ein Funktor ein Objekt und klar hat es einen Zustand. Wenn dem nicht so wäre, würede folgendes ja nicht gehen:
class predicate { private: string name; public: predicate() { name = "Mustermann"; } int operator()(const string& n) { return name==n; } }; int main() { vector<string> names; names.push_back("Musterfrau"); names.push_back("Mustermann"); if( find_if(begin(names),end(names),predicate())!=end(names) ) cout << "ja, vorhanden"; }Wenn ein Funktor keinen Zustand hätte, könnte man ihn ja mit nichts vergleichen.
-
Und eine Stateless Object von predicate ist unmöglich?
-
Zeus schrieb:
Und eine Stateless Object von predicate ist unmöglich?

Du meinst sowas, oder?class foo { }; foo f;Ok, wenn ein Klasse keine Attribute hat, kann ein Objekt auch keinen Zustand haben. Aber wann verwendet man praktisch sowas schon?
-
Nein, eine leere Klasse meint ich nicht, Methode sind keine Attribute, daher kannst du sie dort auch reinpacken. Evtl. wenn man funktionaler wird.
-
Gugelmoser schrieb:
Aber wann verwendet man praktisch sowas schon?
Ich verwende mehr Klassen ohne Attribute als Klassen mit.
-
Zeus schrieb:
Nein, eine leere Klasse meint ich nicht, Methode sind keine Attribute, daher kannst du sie dort auch reinpacken. Evtl. wenn man funktionaler wird.
Hmm verstehe dich irgendwie nicht ganz, vielleicht zeigst du kurz an einem Beispielcode, was für dich ein stateless Object ist.
