Parameterübergabe als Referenz



  • Hallo zusammen,

    wenn ich ne Methode mit einem Referenzparameter hab:

    int method(Object &o);
    

    Wie kann ich diese Methode dann mit einem Object oder Object* (!=0) aufrufen?

    Wenn vor dem Parameter ein const steht heißt es doch nur, dass der Wert in
    der Methode nicht verändert werden kann, oder?
    und was heißt ein const nach den Klammern?

    Gruß,
    CSpille



  • Das tolle an Referenzen ist, dass du den Aufruf nicht merkst:

    void method (Class& obj);
    
    ...
    
    Class myObj;
    method(myObj); // normalo
    

    Wenn vor dem Parameter ein const steht heißt es doch nur, dass der Wert in
    der Methode nicht verändert werden kann, oder?

    Jap, sieht man nur bei call-by-reference da ja call-by-value sowieso nichts in der Methode verändern kann. call-by-value und const-call-by-reference haben die gleichen Auswirkungen in der Methode -> Objekt das ich nicht nach außen hin verändern kann. Mit dem Unterschied, dass ich für große Objekte (eigentlich alles was größer als 8byte ist auf nem 64-bit-rechner) nur die 8byte für den zeiger (jaja, referenzen sind intern auch zeiger) übergeben muss und mich eine vollständige kopie tonnen von bytes kosten könnte.

    und was heißt ein const nach den Klammern?

    Das legt fest, dass die Methode keine Member-Variablen der Klasse verändert. Damit kann sie auch für const-Objekee aufgerufen werden:

    class Class
    {
        int m_x;
    
        Class(int x) : m_x(x) {}
    
        void method1 () { m_x = 5; } // Nicht const, verändert Member
        void method2 () const { tu_was_anderes; } // const, verändert keine Member
        void method3 () const { m_x = 5; } // Compiler-Fehler
    };
    
    // hab ich jetzt ein const-obj, zB weil ich es per const-by-reference übergeben bekommen habe:
    void meineFunktion (const Class& obj)
    {
        obj.method1(); // Nicht erlaubt, habe const-objekt und kann nur const-methoden aufrufen
        obj.method2(); // erlaubt, tut ja nix an Class und somit blebt obj nach außen hin konstant, erlaubt
    }
    

    MfG SideWinder



  • CSpille schrieb:

    Wie kann ich diese Methode dann mit einem Object oder Object* (!=0) aufrufen?

    Object a,b;
    a.method(b);
    

    Also ganz einfach den Variablennamen hinschreiben.
    Object* für bei einem Parameter (Object &) nicht funktionieren.

    CSpille schrieb:

    Wenn vor dem Parameter ein const steht heißt es doch nur, dass der Wert in
    der Methode nicht verändert werden kann, oder?
    und was heißt ein const nach den Klammern?

    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ



  • Hallo nochmal...

    Danke schonmal!
    Ich habe es auch so probiert ein Object an den Referenzparameter zu übergeben.

    Das funktioniert nicht, aber ich weiß nicht wieso.

    Der Konstruktor besitzt folgende Signatur:

    SMutexLocker(SMutex &mutex);
    

    Die folgende Zeile funktioniert:

    SMutexLocker(SMutex());
    

    Allerdings macht er beim Compilieren dieses Codes:

    SMutex mutex();
    SMutexLocker(mutex);
    

    folgende Fehler:

    */home/CSpille/projects/cspille/src/Test.cpp:27: error: no matching function for call to `SMutexLocker::SMutexLocker(SMutex (&)())'
    */home/CSpille/projects/cspille/src/smutexlocker.h:13: error: candidates are: SMutexLocker::SMutexLocker(const SMutexLocker&)
    */home/CSpille/projects/cspille/src/smutexlocker.h:15: error: SMutexLocker::SMutexLocker(SMutex&)

    Auch bei der Übergabe eines statischen SMutex macht er die gleiche Fehler-
    meldung.

    Gruß,
    CSpille



  • SMutex mutex();
    

    Das ist eine Funktionsdefinition keine Instanzierung



  • *argh*

    Ich Depp...

    thx


Anmelden zum Antworten