_peter schrieb:
Hallo,
die beiden folgenden Funktionen machen offenbar das selbe:
void seti(int* i)
{
*i = 3;
}
void setj(int& j)
{
j = 3;
}
Variante 1 gefällt mir deutlich besser, denn da sieht man schon beim Implementieren, dass Parameter i sehr wahrscheinlich von der Funktion geändert wird.
Sind beide Funktionen wirklich äquivalent oder übersehe ich etwas?
Peter
Die Funktionen sind äquivalent, es werden in beiden Fällen Adressen kopiert. Aber darum geht es bei den Referenzen nicht.
Referenzen sind Zeiger, die Dir garantieren (sogut es geht - man kann es auch vermurksen), dass sie auf ein existierendes Objekt zeigen. Du verwendest eine Referenz wie einen lokales Objekt auf dem Stack, bei einem Zeiger ist die Chance, dass der Zeiger ungültig ist, definitiv gegeben.
Die Referenz ist also IMMER zu bevorzugen, der Zeiger nur da, wenn ein nicht gültiger Zeiger akzeptabel ist (z.B. NULL).
Ob ein Parameter geändert wird, solltest Du nicht von Zeiger oder Refernz abhängig machen. Das Schlüsselwort heißt "const". Ein const Argument darf nicht verändert werden.
Deine Funktionen sollten also
void seti(int const & i) // i ist const und wird nicht verändert.
{
i = 3; // das geht nicht, du hast in der Signatur garantiert, dass i nicht geändert wird.
}
void setj(int & j) // nicht const => Du musst davon ausgehen, das j bei verändert wird.
{
j = 3; // kein Problem.
}