Variablen, Zeiger, Referenzen



  • Ja, einfache Frage, aber man muss dafür sehr sehr weit ausholen, um es richtig zu beantworten.



  • Gora1000 schrieb:

    Ich weiß wie ich Zeiger, Variablen bzw. Referenzen deklarieren und initialisieren muss.

    Wirklich?
    Zunächst mal solltest du den Unterschied zw. deklarieren und definieren kennen und verstehen. Den kennst du nämlich definitiv nicht.

    Gora1000 schrieb:

    Was ich immer noch nicht verstehe, wann benutze ich was davon und welche Vorteile hat das eine gegeüber dem anderen.

    Referenz-Objekte müssen immer initialisiert werden, Zeiger nicht, d.h. Zeiger können auf irgendwelchen Unsinn verweisen, Referenzen nicht; es ist sicher leicht einzusehen, dass dies ein enormer Vorteil für sicheren Programmcode ist
    Außerdem sind Referenzen dazu geschaffen worden, C++ Leute mit mangelndem Zeigerverständnis einen halbwegs einfacheren Ersatz anzubieten. C++ Leute haben nämlich erfahrungsgemäß nur nebulöse Vorstellungen, wer oder was Zeiger sind und wie man sie sinnvoll einsetzt, deshalb:
    - benutzte Referenzen statt Zeiger immer wo es möglich ist (außer z.B. beim Einbinden originärer C-Libs)
    - verwende außer static_cast keine anderen Casts (und schon gar keine C-Casts)

    Gora1000 schrieb:

    Zum Beipiel warum sollte man die Variablen einer Klasse als Zeiger deklarieren und nicht als normale Variablen.

    Niemals. Lies mal was über RAII.

    Klasse *kzeiger = new Klasse;
    

    Ist totaler Schwachsinn, und noch viel größerer Unsinn ist, dass C++ sowas überhaupt erlaubt.

    Gora1000 schrieb:

    Oder warum benutzt man an bestimmten Stellen im Code Referenzen anstatt von Zeigern.

    Weil Referenzen (s.o.) handlicher für ungeübte Programmierer sind und vor allem weil sie nicht uninitialisiert sein können (außer man castet hier irgendwelchen Müll zusammen) und somit nicht wie Zeiger auf Unsinn verweisen können und es bei Dereferenzierung somit per se nicht knallen kann.



  • Wutz schrieb:

    Referenz-Objekte

    Referenzen sind keine Objekte im Sinne der Objekt-Definition von C++.



  • Referenzen sind Objekte, weil sie definiert werden müssen und somit Speicherplatz belegen. Ich sehe das jedenfalls so.


  • Mod

    Wutz schrieb:

    Referenzen sind Objekte, weil sie definiert werden müssen und somit Speicherplatz belegen. Ich sehe das jedenfalls so.

    Es gibt keine Regel, die besagt, dass eine Definition zwangsläufig dazu führt, das Speicher reserviert wird (umgekhrt schon: die Reservierung des Speichers einer benannten Entität, die tatsächlich Speicher belegt, erfolgt durch die Definition). Klassen, Aufzählungen, Templates, Namensräume (kein Anspruch auf Vollständigkeit) haben alle Definitionen, die nicht (per se) zu einer Speicherresevierung führen.

    n3337 schrieb:

    1.8/1
    [...] An object is a region of storage.

    8.3.2/4 It is unspecified whether or not a reference requires storage (3.7).

    3./6 A variable is introduced by the declaration of a reference other than a non-static data member or of an object. The variable’s name denotes the reference or object.

    3.7 Storage duration [basic.stc]
    1 Storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object.
    [...]
    3 The storage duration categories apply to references as well. The lifetime of a reference is its storage duration.

    Man kann problemlos noch viele weitere indirekte Hinweise finden.

    Referenzen sind keine Objekte.



  • Oder auch:

    1.8/1 aus n3337.pdf schrieb:

    [...] The term object type refers to the type with which the object is created. [...]

    mit

    3.9/8 aus n3337.pdf schrieb:

    An object type is a (possibly cv-qualified) type that is not a function type, not a reference type, and not a void type.



  • Wutz schrieb:

    Gora1000 schrieb:

    Zum Beipiel warum sollte man die Variablen einer Klasse als Zeiger deklarieren und nicht als normale Variablen.

    Niemals. Lies mal was über RAII.

    RAII regelt Besitzverhältnisse. Wenn die nicht ins Spiel kommen -- man einen nicht besitzenden Verweis auf ein anderes Objekt braucht, der auch mal umgehangen werden kann -- ist ein nackter Zeiger ein legitimes Mittel.

    Zum Beispiel:

    class tree_node {
      ...
    
      std::unique_ptr<tree_node> left, right; // Besitzend.
      tree_node *parent;                      // Nicht besitzend.
    };
    
    class tree_iterator {
      ...
    
      tree_node *node; // Nicht besitzend.
    };
    

    Viel Hoffnung habe ich nicht, dass irgendwas davon bei dir hängen bleibt, aber der obligatorische Hinweis: Du solltest das Maul nicht so weit aufreißen, bevor du nicht selbst zumindest ein bisschen was von der Materie verstehst. Und Anfängern gegenüber ist sowieso ein sanfterer Ton angebracht.



  • Beschränkte Sichtweise von Möchtegern-OOPlern:
    In OOP ist alles ein Objekt, selbst Klassen. Wenn C++ sowas nicht abbilden kann, zeigt das wieder nur die o.g. Beschränkheit von C++ bzgl. OOP.



  • Ha! Du bist wutzig.

    Aber vielleicht gehst du ja jetzt öfter mal das Java-Forum trollen.



  • Wutz schrieb:

    Gora1000 schrieb:

    Ich weiß wie ich Zeiger, Variablen bzw. Referenzen deklarieren und initialisieren muss.

    Wirklich?
    Zunächst mal solltest du den Unterschied zw. deklarieren und definieren kennen und verstehen. Den kennst du nämlich definitiv nicht.

    Gora1000 schrieb:

    Was ich immer noch nicht verstehe, wann benutze ich was davon und welche Vorteile hat das eine gegeüber dem anderen.

    Referenz-Objekte müssen immer initialisiert werden, Zeiger nicht, d.h. Zeiger können auf irgendwelchen Unsinn verweisen, Referenzen nicht; es ist sicher leicht einzusehen, dass dies ein enormer Vorteil für sicheren Programmcode ist
    Außerdem sind Referenzen dazu geschaffen worden, C++ Leute mit mangelndem Zeigerverständnis einen halbwegs einfacheren Ersatz anzubieten. C++ Leute haben nämlich erfahrungsgemäß nur nebulöse Vorstellungen, wer oder was Zeiger sind und wie man sie sinnvoll einsetzt, deshalb:
    - benutzte Referenzen statt Zeiger immer wo es möglich ist (außer z.B. beim Einbinden originärer C-Libs)
    - verwende außer static_cast keine anderen Casts (und schon gar keine C-Casts)

    Gora1000 schrieb:

    Zum Beipiel warum sollte man die Variablen einer Klasse als Zeiger deklarieren und nicht als normale Variablen.

    Niemals. Lies mal was über RAII.

    Klasse *kzeiger = new Klasse;
    

    Ist totaler Schwachsinn, und noch viel größerer Unsinn ist, dass C++ sowas überhaupt erlaubt.

    Gora1000 schrieb:

    Oder warum benutzt man an bestimmten Stellen im Code Referenzen anstatt von Zeigern.

    Weil Referenzen (s.o.) handlicher für ungeübte Programmierer sind und vor allem weil sie nicht uninitialisiert sein können (außer man castet hier irgendwelchen Müll zusammen) und somit nicht wie Zeiger auf Unsinn verweisen können und es bei Dereferenzierung somit per se nicht knallen kann.

    @Gora: Sowas hatte ich befürchtet. Eine echt halbgare Antwort, die Dich weiter zurückwirft, als Dich weiterzubringen.
    Kauf am besten ein gutes C++-Buch.


Anmelden zum Antworten