Initialiserungsliste



  • icarus2 schrieb:

    Gugelmoser schrieb:

    class foo
    {
    private:
    	int i;
    public:
    	foo() // Wenn i doch hier definiert wird...
    	{ // ...kann doch ab hier keine Initialisierung mehr stattfinden...
    		i = 7;  // ...sondern nur noch eine Zuweisung.
    	}
    };
    

    Was versteht ihr also unter später initialisiern?

    Die Variable i ist nicht initialisiert, sie enthaelt einen undefinierten Wert, denn sie wurde nie initialisiert. Deswegen ist i = 7 eine Initialisierung.

    😮 Ok, dann verstehen wir was unterschiedliches unter Initialisierung. Für mich beinhaltet eine Initialisierung immer eine Definition... Folglich unterscheidest du nicht zwischen Initialisierung und Zuweisung, oder wie?



  • icarus2 schrieb:

    Deswegen ist i = 7 eine Initialisierung.

    i = 7 ist eine Zuweisung. Und zwar immer. Zugegeben: Bei einem simplen int macht das hier keinen wirklichen Unterschied, aber das ändert nix an der Terminologie.



  • Es ist sehr heikel unter welchen Umstaenden etwas initialisiert wird.

    Zum Beispiel hier wird i nicht initialisiert:

    class foo
    {
    public:
    	int i;
    
    	foo()
    	{
    		// x ist hier nicht initialisiert
    	}
    };
    
    int main()
    {
    	foo f;
    	cout << f.i << endl;
    }
    

    Ich habe vorher gegoogelt und keine genauen Informationen dazu gefunden. Scott Meyers meint mal soll einfach immer alle Variablen initialisieren, da die Regeln viel zu kompliziert seien.



  • Also so kompliziert sind die Regeln jetzt nicht...



  • dot schrieb:

    Also so kompliziert sind die Regeln jetzt nicht...

    Aber warum soll dann i = 7 immer eine Zuweisung sein? Vielleicht habe ich eine falsche Definition von Initialisierung im Kopf. Aber i = 7 ist doch eine Initialisierung weil der Variable i vorher noch kein Wert zugewisen wurde. Sie hat bloss uninitialisierten Speicher bekommen. Dann waere i = 7 doch eine Initialisierung?



  • 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.


Anmelden zum Antworten