Ich verstehe die Syntax und die allgemeine Semantik von Zeigern gegenüber Referenzen, aber wie soll ich entscheiden, wann es mehr oder weniger angemessen ist, Referenzen oder Zeiger in einer API zu verwenden?
Natürlich benötigen einige Situationen die eine oder andere ( operator++
benötigt ein Referenzargument), aber im Allgemeinen bevorzuge ich Zeiger (und konstante Zeiger), da die Syntax klar ist, dass die Variablen destruktiv übergeben werden.
ZB im folgenden 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 (offensichtlicher), was los ist. Sind APIs und APIs, bei denen Klarheit ein großes Problem darstellt, Zeiger nicht geeigneter als Referenzen? Bedeutet das, dass Referenzen nur bei Bedarf verwendet werden sollten (z. B. operator++
)? Gibt es Leistungsprobleme mit dem einen oder anderen?
BEARBEITEN (veraltet):
Neben dem Zulassen von NULL-Werten und dem Umgang mit Raw-Arrays scheint die Wahl von den persönlichen Vorlieben abhängig zu sein. Ich habe die folgende Antwort akzeptiert, die auf den C ++ - Style Guide von Google verweist , da sie die Ansicht enthält, dass "Verweise verwirrend sein können, da sie eine Wertsyntax, 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)
wird die Zeigerversion aufgerufen und zur Laufzeit unterbrochen), ist es aus Sicht der Wartbarkeit sinnvoll, Referenzen zu verwenden, bei denen ein Objekt vorhanden sein muss, obwohl dies eine Schande ist die syntaktische Klarheit zu verlieren.
add_one(a);
ist unklar, ob a
das geändert wird? Es steht direkt im Code: Fügen Sie eine hinzu .
addOneTo(...)
. Wenn Sie das nicht möchten, schauen Sie sich einfach die Erklärung an.