const beim Funktionsaufruf
-
Hio!
Wann soll man bei c++ "const" verwenden, wenn es um Funktionsaufrufe geht?
Bzw. Wie sieht da der richtige Aufbau aus?
BSP:class Vector { //blabla Vector(const Vector &pVector); Vector(double XKoord, double YKoord, double zKoord); //blabla }; Vector::Vector(const Vector &pVector) { SetXKoord(pVector.GetXKoord()); //soo? oder wie dann? SetYKoord(pVector.GetYKoord()); SetZKoord(pVector.GetZKoord()); } //wie sieht dann der richtig Aufruf aus? so?: int main() { Vector v1(10,10,10); Vector v2(v1); oder Vector v2(&v1)? }Gibt es dann noch irgendwelche Lücke oder Fälle wo man das nicht machen sollte oder sollte man der performance halber jeden Aufruf mit Objekten so gestalten?
Danke!
-
Pille456 schrieb:
Hio!
[cpp] class Vector {
//blabla
Vector(const Vector &pVector);
Vector(double XKoord, double YKoord, double zKoord);
//blabla
};Vector::Vector(const Vector &pVector) {
SetXKoord(pVector.GetXKoord()); /*soo? oder wie dann? **Ja, genau sowobei auch XKoord = pVector.XKoord; funkionieren würde
***/SetYKoord(pVector.GetYKoord());
SetZKoord(pVector.GetZKoord());
}//wie sieht dann der richtig Aufruf aus? so?:
int main() {
Vector v1(10,10,10);
Vector v2(v1); /*<--- So ist richtig, für den Aufrufer ist es transparent,
ob die aufgerufene Funktion/Methode Referenzen verwendet, oder Vector v2(&v1)? */
}
[/cpp]
Gibt es dann noch irgendwelche Lücke oder Fälle wo man das nicht machen sollte oder sollte man der performance halber jeden Aufruf mit Objekten so gestalten?Danke!
const ist wichtig bei Parameterübergabe per Referenz, wenn das übergebene Objekt nicht verändert werden soll.
-
Hmmm komischerweise bekomme ich beim Zugriff auf "GetXKoord()" dann diese Meldung:
passing `const Vector' as `this' argument of `double Vector::GetXKoord()' discards qualifiers
-
Pille456 schrieb:
Hmmm komischerweise bekomme ich beim Zugriff auf "GetXKoord()" dann diese Meldung:
passing `const Vector' as `this' argument of `double Vector::GetXKoord()' discards qualifiers
Das liegt daran dass du GetXKoord() für ein konstantes Objekt aufrufst. Das geht nur wenn du GetXKoord so deklarierst dass es das entsprechende Objekt konstant lässt:
class Vector { public: double GetXKoord() const; //<-- const! };
-
Beispiel:
void doRight(const std::string& s) { } void doWrong(std::string& s) { } int main() { doRight("Richtig"); //Richtig: Literal wird zu const Referenz auf temporäres string Objekt doWrong("Falsch"); //Falsch: Literal wird zu Referenz auf temporäres string Objekt. (Geht nicht) }
-
btw. beim Copy-Ctor brauchst Du nicht die Getter verwenden, sondern kannst direkt die Attribute auslesen.