Was bedeuten die beiden Operatoren & und :: ?



  • akari schrieb:

    Aber was macht das &

    Besagt das der Rückgabewert eine Referenz sein soll

    Falsch, & besagt, dass der Parameter Name eine Referenz ist.

    verstehe ich auch nicht was hier der :: zusuchen hat sowie der >>

    :: ist hier der Auruf der Funktion lese aber aus der Basisklasse Kunde, von der die Klasse Rabattkunde abgeleitet ist

    :: ist kein Funktionsaufruf. Kunde::lese sagt, dass die Funktion lese, die in Kunde deklariert ist, aufgerufen wird. :: sagt somit, in welchem Scope nach der Funktion lese gesucht werden soll.

    Sorry, wenns en bisschen kleinlich aussieht, aber wie soll t1m0n was lernen, wenn du dich so schlecht ausdrückst?



  • Hallo

    Dann eben anstatt noch exakter stattdessen...
    zum Beispiel das hier.

    /Edit :

    Falsch, & besagt, dass der Parameter Name eine Referenz ist.

    In dem zweiten Code war das & auch als Referenz für eine Rückgabe.

    bis bald
    akari



  • Javaner schrieb:

    > wird bei Inputstreams benutzt um etwas aus dem Stream in eine Variable zu schieben

    aber nicht verwechseln mit dem echten shift operator....



  • :: Ist der Bereichsauflösungsoperator damit kannst dir einen Bereich "zugänglich" machen.
    Das & sagt im ersten Beispiel das der Parameter nicht kopiert werden soll sondern als referenz übernommen werden soll also kann man den parameter ändern.
    Beim 2. Beispiel steht das & vor dem funktionsnamen und das sorgt dafür das die funktion auch auf der linken seite eines Ausdrucks stehen darf, sprich als L-Value.
    Aber du solltest deine Bücher lieber einzelnt lesen!



  • akari schrieb:

    In dem zweiten Code war das & auch als Referenz für eine Rückgabe.

    Sorry, hab ich übersehen.

    tobZel schrieb:

    Beim 2. Beispiel steht das & vor dem funktionsnamen und das sorgt dafür das die funktion auch auf der linken seite eines Ausdrucks stehen darf, sprich als L-Value.

    Nur wenn die Referenz auf eine Variable zeigt, die außerhalb der Funktion deklariert wurde.

    int &foo()
    {
        int bar;
        // mach irgendwas mit bar
        return bar;
    }
    

    ➡ undefiniertes Verhalten



  • Michael E. schrieb:

    Nur wenn die Referenz auf eine Variable zeigt, die außerhalb der Funktion deklariert wurde.

    ...oder wenn die lokale Variable statisch ist. Dann geht's auch.

    int& foo() {
      static int i;
      return i;
    }
    
    foo() = 7;
    

    MfG

    GPC



  • Ja aber wer gibt schon ne referenz auf ne lokale Variable zurück??



  • Och, das ist ganz schnell passiert, wenn man noch nie drüber nachgedacht hat. Manche Compiler akzeptieren das sogar.



  • Frage, wie sieht eigentlich damit aus:

    class A {
    
    private:
     int sth;
    
    public:
     ...
     int& getSth(){
       return sth;
     }
    };
    
    class B {
    
    private:
      class A a;
    
    public:
      ...
      int& getSthModifiedFromA(){
        int& i = a.getSth();
        i += 1;
        return i;
      }
    };
    

    Gibt es sowas in der Art auch, dass ich Referenzen nutze und dann weiterreichen kann? Oder muss ich dass über einen Pointer lösen?



  • Ja, das funktioniert auch. Allerdings würde deine Methode auch das Element von A verändern.

    (und nebenbei machst du mit GetSth() die Sicherheit zunichte, die du mit der private-Deklaration erreichen wolltest)



  • Danke ... kann ich die Referenz nicht const machen? Damit darf man doch nicht daran ändern oder?



  • Nachtrag: Natürlich nur unter der Bedingung, dass ich selbst an der Referenz nichts ändern möchte, sondern nur Werte etc. erhalten möchte, um den Zustand der zugreifenden Objektes anzupassen.



  • Klar kann GetSth() eine konstante Referenz zurückgeben (wenn du statt int's größere Objekte verwaltest, ist das sogar günstiger als eine Wert-Übergabe). Allerdings kann B::getSthModifiedFromA() in der obigen Form nichts mit einem const int& anfangen.


Anmelden zum Antworten