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.
-
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...
-
Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch
const Vector3D* pOut = 0schreiben können ?
Danke
Blue
-
-
Blue5teel schrieb:
- 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.
- Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch
const Vector3D* pOut = 0schreiben 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:
- 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:
- Ist die Reihenfolge der Schlüsselwörter "Vector3D" und "const" be Deklaration von pOut egal ? Hätte man also auch
const Vector3D* pOut = 0schreiben 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