Klassen - wann . -> :: ?



  • Hallo allerseits,

    ich habe mal eine Frage. Gibt es da irgendein "Gesetz" an das man sich halten kann, wann man man die Operatoren . -> und :: benutzt um auf Membervariablen eines Objektes zuzugreifen?

    Finde das noch etwas verwirrend, wann sich was besser eignet oder was generell die Konvention - also "ĂĽblich - ist.

    Vielen Dank euch 🙂 !



  • Grundsätzlich brauchst du . beim Zugriff auf Objekte und :: beim Zugriff auf Typen und Namensräume.

    Hast du ein gutes C++-Buch? Solche Dinge sollten eigentlich erklärt werden...



  • `1: Objekt.Member

    2: ZeigerAufObjekt->Member

    3: Typ::Member

    4: Namespace::Member

    `

    1 und 2 werden typischerweise verwendet um auf nicht-statische Member zuzugreifen. DĂĽrfen aber auch verwendet werden um aus statische Member zuzugreifen, obwohl man hier typischerweise Variante 3 nimmt.

    Mit 3 kann man nur auf statische Member eines Typs zugreifen.

    Und mit 4 greift man auf "Namespace Member" zu. Also Typen oder Funktionen die in diesem Namespace deklariert werden.

    "Innerhalb" eines Objekts/Typs/Namespaces kann die Qualifizierung typischerweise wegfallen.
    Also konkret: innerhalb von Memberfunktionen kann man das "this->" bzw. "Typname::" weglassen, und einfach nur den Namen von Membern schreiben.

    Und innerhalb eines Namespaces kann man das "NamespaceName::" weglassen.



  • Danke an euch beide ! Das hat mir sehr geholfen.



  • Kleine Ergänzung:

    -> ist als AbkĂĽrzung fĂĽr die Kombination von * und . entstanden.

    ZeigerAufObjekt->Element
    

    ist dasselbe wie

    (*ZeigerAufObjekt).Element
    

    Dass der Dereferenzierungsoperator (*) hier ein Präfixoperator ist, ist halt doch irgendwie etwas unpraktisch bei Element-Zugriffen.

    In Pascal war der Dereferenzierungsoperator hingegen ein Postfixoperator (^) und man schriebt das dann einfach so:

    ZeigerAufObjekt^.Element
    

    und brauchte deswegen keine extra Syntax wie ->


  • Mod

    Ergänzung: Es gibt da noch die wenig bekannten Operatoren .* und ->* . Braucht man eher selten (den ersten habe ich ungefähr einmal gebraucht, den zweiten nie), aber ist gut zu wissen, dass sie existieren, wenn man mal mit Memberfunktionszeigern arbeitet.

    P.S.: Der Plenk ist absichtlich gesetzt, damit man sieht, was zum Operator gehört und was Interpunktion ist.


Log in to reply