Konstante Referenz in Signatur einer Funktion



  • Bin im Netz auf folgenden Code gestoßen:

    bool LineHitsPlane(const Vector3D& LineA,    
                       const Vector3D& LineB,    
                       const Plane& Plane,       
                       Vector3D* const pOut = 0)
    

    Hätte da zwei grundlegende Fragen.

    1. Die Parameter "LineA, LineB und Plane" werden innerhalb der Funktion nicht verändert. Sie werden nur ausgelesen. Warum deklariert der Autor sie dann als Referenz ? Wenn sie doch eh konstant sind...

    2. Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch

    const Vector3D* pOut = 0
    

    schreiben können ?

    Danke
    Blue



  • Blue5teel schrieb:

    1. Die Parameter "LineA, LineB und Plane" werden innerhalb der Funktion nicht verändert. Sie werden nur ausgelesen. Warum deklariert der Autor sie dann als Referenz ? Wenn sie doch eh konstant sind...

    Damit sie bei der Übergabe nicht kopiert werden. Das hat z.B. Auswirkungen auf die Geschwindigkeit.

    1. Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch
    const Vector3D* pOut = 0
    

    schreiben können ?

    Nein, ist nicht egal. const bezieht sich immer auf das Element, das genau links neben dem const steht. T * const x; ist also ein konstanter Pointer auf T, T const * x wäre ein Pointer auf ein konstantes T. Ausnahme: Wenn das const am Anfang steht, bezieht es sich auf den Typ T, also bedeutet const T * x; das gleiche wie T const * x;
    In deiner Deklaration macht das konstant-deklarieren des Pointers übrigens nicht besonders viel Sinn. Nach außen ist das sowieso wegen der Übergabe by-value nicht erkennbar.



  • Blue5teel schrieb:

    1. Die Parameter "LineA, LineB und Plane" werden innerhalb der Funktion nicht verändert. Sie werden nur ausgelesen. Warum deklariert der Autor sie dann als Referenz ? Wenn sie doch eh konstant sind...

    Damit sie nicht kopiert werden. Das macht man mit so ziemlich allem, was größer als long ist.

    Blue5teel schrieb:

    1. Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch
    const Vector3D* pOut = 0
    

    schreiben können ?

    AFAIK zählt nur, woran der * hängt.

    /edit: Hör auf Bashar, ich benutze kaum Zeiger 😉



  • Ohne Referenz würde eine Read-Only Kopie erstellt werden. Das Kopieren kostet mehr Zeit als ne Referenz zu übergeben. Hat also Performance Gründe.

    Zur 2. Frage: Es gibt einen Unterschied.

    const Vector3D* pOut;
    Vector3D* const pOut;

    Das eine heiß: Ich habe nen Pointer auf einen Datentyp "const Vector3D".
    Das andere heiß: Ich habe einen Pointer, der nicht verändert werden darf auf einen Datentyp "Vector3D".

    Was was war hab ich vergessen. Die Syntax konnt ich mir noch nie merken. *g*



  • Ok, danke Kollegen.
    Sehr aufschlussreich...

    Blue


Anmelden zum Antworten