Ich verstehe die Syntax und die allgemeine Semantik von Zeigern gegenüber Referenzen, aber wie sollte ich entscheiden, wann es mehr oder weniger angemessen ist, Referenzen oder Zeiger in einer API zu verwenden?
Natürlich braucht man in manchen Situationen das eine oder das andere ( operator++
braucht ein Referenzargument), aber im Allgemeinen finde ich, dass ich lieber Zeiger (und const-Zeiger) verwende, da die Syntax klar ist, dass die Variablen destruktiv übergeben werden.
Z.B. in folgendem Code:
void add_one(int& n) { n += 1; }
void add_one(int* const n) { *n += 1; }
int main() {
int a = 0;
add_one(a); // Not clear that a may be modified
add_one(&a); // 'a' is clearly being passed destructively
}
Mit dem Zeiger ist es immer (mehr) offensichtlich, was los ist, so dass für APIs und dergleichen, wo Klarheit ist ein großes Anliegen sind Zeiger nicht besser geeignet als Referenzen? Bedeutet das, dass Referenzen nur verwendet werden sollten, wenn es notwendig ist (z.B. operator++
)? Gibt es bei dem einen oder dem anderen irgendwelche Leistungsprobleme?
BEARBEITEN (VERALTET):
Neben der Ermöglichung von NULL-Werten und dem Umgang mit rohen Arrays, scheint es, dass die Wahl auf die persönliche Vorliebe kommt. Ich habe die Antwort unten akzeptiert, die sich auf Googles C++ Style Guide Sie vertreten die Ansicht, dass "Referenzen verwirrend sein können, da sie eine Wertesyntax, aber eine Zeigersemantik haben".
Aufgrund der zusätzlichen Arbeit, die erforderlich ist, um Zeigerargumente zu bereinigen, die nicht NULL sein sollten (z. B. add_one(0)
die Zeigerversion aufruft und während der Laufzeit abbricht), ist es aus Sicht der Wartbarkeit sinnvoll, Referenzen zu verwenden, wenn ein Objekt vorhanden sein MUSS, obwohl es schade ist, die syntaktische Klarheit zu verlieren.