Referenzoperator



  • Hallo,
    ich lerne gerade C++ mit einem Einsteigerbuch. In dem Buch wird der Referenzoperator auf eine Weise benutzt, die nicht beschrieben wurde. Ich weiß, dass der Referenzoperator vor einer Variablen bedeutet, dass man direkt mit der Variablen arbeitet und nicht mit einer Copy, wenn diese an eine Funktion übergeben wird. Nun taucht bei einer Funktionsdefinition häufig der Fall auf dass der Referenzoperator direkt an den Variablentyp angehängt wird. Was bedeutet er in diesem Fall. Z.B.
    ostream& operator<<(ostream& Stream, const tBruch& 😎
    Hier sind ostream und tBruch Datentypen.
    Mir ist auch eine mir unverständliche Verwendung vom Zeigeroperator aufgefallen. Z.B.
    bool pop(T *);
    Was bedeutet der Operator, wenn er mit einem Leerzeichen hinter einem Typ steht, wenn gar keine Variable vorkommt?
    Ich habe auch schon die Verwendung des Sterns gesehen, dass der Stern zwischen Typ und Name steht, von beiden mit einem Leerzeichen getrennt.
    Ich hoffe mir kann jemand weiterhelfen.



  • Simon_St schrieb:

    Ich weiß, dass der Referenzoperator vor einer Variablen bedeutet, dass man direkt mit der Variablen arbeitet und nicht mit einer Copy,

    Hmm... "Referenzoperator" habe ich noch nie gehört. Aber ich weiß, was Du meinst. Mit dem Dingen kannst Du eine Referenz deklarieren. Syntaktisch funktioniert es wie ein unärer Präfixoperator wie der Addressoperator auch einer ist. Der Adressoperator wurde für Deklarationen von Referenzen einfach zweckentfremdet.

    Simon_St schrieb:

    wenn diese an eine Funktion übergeben wird. Nun taucht bei einer Funktionsdefinition häufig der Fall auf dass der Referenzoperator direkt an den Variablentyp angehängt wird. Was bedeutet er in diesem Fall. Z.B.
    ostream& operator<<(ostream& Stream, const tBruch& 😎

    Was soll denn hier anders sein als die Benutzung von &, die Du kennst?

    Es bedeutet "Stream ist eine Referenz auf ein ostream-Objekt" und "B ist eine Referenz auf ein tBruch-Objekt". Du kannst die Deklarationen von "innen nach außen" bzw "rechts nach links" lesen und für & einfach "Referenz auf" einsetzen. Die Reihenfolge wird durch die Operatorpräzedenz bestimmt. Beispielsweise:

    int * s  [5]; // s ist ein 5-elemntiges Array aus Zeigern auf int
    int (*s) [5]; // s ist ein Zeiger auf ein 5-elementiges Array von ints
    

    Präzedenz kann man sich hier leicht merken: Die Postfix-Operatoren binden stärker als die Präfix-Operatoren.

    Simon_St schrieb:

    Hier sind ostream und tBruch Datentypen.

    Ja und?

    Simon_St schrieb:

    Mir ist auch eine mir unverständliche Verwendung vom Zeigeroperator aufgefallen. Z.B.
    bool pop(T *);
    Was bedeutet der Operator, wenn er mit einem Leerzeichen hinter einem Typ steht, wenn gar keine Variable vorkommt?

    C++ Ignoriert größtenteils Leerzeichen, ausgenommen in Stringliteralen und zur Trennung von "Tokens". Ob Du hier T* oder T * schreibst, macht keinen Unterschied. Es bedeutet, dass die Funktion einen Zeiger auf T übergeben bekommt. Hier wirde der Variablenname einfach weggelassen. Das ist in einer Deklaration erlaubt, da der Name ja sowieso nicht mehr benutzt wird.

    Simon_St schrieb:

    Ich habe auch schon die Verwendung des Sterns gesehen, dass der Stern zwischen Typ und Name steht, von beiden mit einem Leerzeichen getrennt.
    Ich hoffe mir kann jemand weiterhelfen.

    Wo da die Leerzeichen stehen, ist egal.

    int*x;
    int* x;
    int *x;
    int * x;
    

    kommt alles auf'sselbe hinaus.

    Gruß,
    SP


  • Mod

    Leerzeichen sind irrelevant. Sie dienen nur als optische Orientierung für Menschen. (edit: Bis auf die von meinem Vorredner genannten Ausnahmen.)

    foo(int & bar);
    foo(int& bar);
    foo(int &bar);
    foo(int&          bar);
    foo(int             &                bar);
    

    Das ist alles das gleiche.

    Genauso bei Zeigern. Das was dich verwirrt hat, ist der fehlende Name in der Deklaration. Den braucht man an der Stelle nämlich auch gar nicht angeben, der Compiler will nämlich nur wissen, dass die Funktion einen Zeiger auf T übergeben bekommt. Der Name dieses Zeigers wird erst bei der Definition der Funktion von Bedeutung und kann daher vorher weggelassen werden.



  • Simon_St schrieb:

    Nun taucht bei einer Funktionsdefinition häufig der Fall auf dass der Referenzoperator direkt an den Variablentyp angehängt wird. Was bedeutet er in diesem Fall. Z.B.
    ostream& operator<<(ostream& Stream, const tBruch& 😎
    Hier sind ostream und tBruch Datentypen.

    Erst mal vorneweg: Ob du ostream& Stream, ostream &Stream, ostream & Stream oder ostream&Stream schreibst, ist egal. Der Compiler ignoriert sowieso alle nicht nötigen Leerzeichen.

    In diesem Fall hast du eine Funktion, die eine Referenz auf eine ostream-Instanz und eine Referenz auf eine konstante tBruch-Instanz entgegennimmt.

    Mir ist auch eine mir unverständliche Verwendung vom Zeigeroperator aufgefallen. Z.B.
    bool pop(T *);
    Was bedeutet der Operator, wenn er mit einem Leerzeichen hinter einem Typ steht, wenn gar keine Variable vorkommt?

    Hier wurde nur der Name der Variable weggelassen, denn der wird hier nicht benötigt. Das ist äquivalent zu bool pop(T* tollerName);

    Ich habe auch schon die Verwendung des Sterns gesehen, dass der Stern zwischen Typ und Name steht, von beiden mit einem Leerzeichen getrennt.

    Siehe oben.



  • Danke für die Antwort. Es macht also keinen Unterschied wo der Operator steht.


Anmelden zum Antworten