Pointer Referenz Value



  • Hallo erstmal,

    habe folgende Funktionen:

    void ValueFunction(Mammal MammalValue)     {                                         
     MammalValue.Speak();                     
    }  
    
    void PtrFunction(Mammal *pMammal)          
    {                                          
     pMammal -> Speak();                       
    }  
    
    void RefFunction(Mammal &rMammal)
    {
     rMammal.Speak();     
    }
    
    //und folgende Funktionsaufrufe:
    PtrFunction(ptr);
    RefFunction(*ptr);
    ValueFunction(*ptr);
    

    Fragen:
    1. Wann nimmt man den "->" und wann den "." um die Methode aufzurufen?
    2. Wird bei PtrFunction die Adresse übergeben und bei RefFunction und
    ValueFunction das Objekt selbst?



  • 1. Normalerweise nimmt man '.', um auf Elemente eines Objekts zuzugreifen. Pointer mußt du vorher noch dereferenzieren, so daß du eigentlich (*p).el schreiben müsstest - weil das unschön ist, wurde dafür die Abkürzung -> eingeführt.

    2. ptrFunction() bekommt die Adresse des Objekts, RefFunction() eine Referenz (Alias) auf das Objekt (also quasi das Objekt selber), ValueFunction() ein Kopie des Objekts.
    (den Unterschied zwischen Referenz und Kopie siehst du besonders deutlich, wenn die Funktionen das übergebene Objekt ändern wollen)



  • danke dir, hab ich mir auch so gedacht, war nur etwas unsicher 🙂



  • Aber nen Index Zugriff (z.B.) auf nen std::vector<Foo*>*

    muss ich erst dereferenzieren oder gibts ne andere Möglichkeit?

    Also so:

    (*myVec)[3] = new Foo();
    

    oder?



  • In dem Beispiel könntest du noch myVec->operator[](3)=new Foo; oder myVec->at(3)=new Foo;[/c] verwenden (letzteres ist die abgesicherte Version von op[]), aber im Allgemeinen gibt es keine Abkürzung für Dereferenzierung+Indexzugriff.



  • CStoll schrieb:

    letzteres ist die abgesicherte Version von op[]

    Heißt?
    Mit Bereichsüberprüfung?



  • Nachfrager schrieb:

    CStoll schrieb:

    letzteres ist die abgesicherte Version von op[]

    Heißt?
    Mit Bereichsüberprüfung?

    Ja, genau - wenn du einen zu großen (oder negativen) Index angibst, liefert vector::operator[] einen undefinierten Wert, vector::at() wirft dir eine out_of_range Exception entgegen.



  • CStoll schrieb:

    Nachfrager schrieb:

    CStoll schrieb:

    letzteres ist die abgesicherte Version von op[]

    Heißt?
    Mit Bereichsüberprüfung?

    Ja, genau - wenn du einen zu großen (oder negativen) Index angibst, liefert vector::operator[] einen undefinierten Wert, vector::at() wirft dir eine out_of_range Exception entgegen.

    Wenn man einen ungültigen Index verwendet liefert operator [] nicht einen ungültigen Wert, sondern es kommt zu undefiniertem Verhalten.
    Was ein grosser Unterschied ist 😉



  • Etwa so groß wie der Unterschied zwischen "ungültigem" und "undefiniertem" Wert? :p



  • hustbaer schrieb:

    Wenn man einen ungültigen Index verwendet liefert operator [] nicht einen ungültigen Wert, sondern es kommt zu undefiniertem Verhalten.

    wlkikiv - ich sagte nicht "ungültiger Wert", sondern "undefinierter Wert".



  • LordJaxom schrieb:

    Etwa so groß wie der Unterschied zwischen "ungültigem" und "undefiniertem" Wert? :p

    Nein, eher so groß wie der Unterschied zwischen "liefert einen ungültigen/undefinierten Wert" und "liefert gar keinen Wert, weil die Festplatte formatiert wird".

    Mein Compiler liefert bei ungültigen Indizes manchmal gar keine Werte mehr, sondern das Programm stürzt einfach ab. Das ist schon ein Unterschied zu einem falschen Wert.


Anmelden zum Antworten