c ++ * vs & in Funktionsdeklaration [Duplikat]
-
22-08-2019 - |
Frage
Mögliche Duplizieren:
Unterschied zwischen Zeigervariable und Referenzvariable in C ++
Wann soll ich meine Variablen als Zeiger vs Objekten weitergegeben-by-reference erklären? Sie kompilieren, um die gleiche Sache in der Montage (zumindest Laufzeit asymptotisch) so wann sollte ich verwenden, die?
void foo(obj* param)
void foo(obj& param)
Lösung
Meine Regel ist einfach: Verwenden Sie *, wenn Sie diesen Wert ist optional und somit 0 sein kann zeigen wollen
. Ohne von der Regel: alle _obj_s um in Behältern aufbewahrt werden, und Sie wollen nicht, Ihren Code machen hässlich aussieht von überall foo(*value);
statt foo(value);
mit
So kann dieser Wert zu zeigen, nicht 0 Put assert(value);
an der Funktion beginnen.
Andere Tipps
Ich folge dem Google Style Guide Standard wie es macht die meisten Sinn für mich. Darin heißt es:
Im Funktionsparameter listet alle Referenzen müssen const sein:
void Foo(const string &in, string *out);
In der Tat ist es eine sehr starke Konvention in Google Code, Eingabeargumente Werte sind oder const Referenzen während Ausgangs Argumente sind Zeiger. Eingang Parameter können const Zeiger sein, aber wir niemals zulassen, nicht konstante Referenz Parameter.
Ein Fall, wenn Sie könnten einen Eingang wollen Parameter zu sein, um ein const Zeiger ist, wenn betonen möchten Sie, dass die Argument wird nicht kopiert, so muss es gibt es für die Lebensdauer des Objekts; es ist in der Regel am besten, dies zu dokumentieren, in sowie Kommentare. STL-Adapter wie bind2nd und mem_fun nicht zulassen Referenzparameter, so müssen Sie deklarieren Funktionen mit Zeigern Parameter in diesen Fällen auch.
Ein Grund Zeiger zu verwenden, wenn es Sinn macht, einen NULL
Wert in die Funktion zu übergeben. Mit einem Zeiger, wird es voraussichtlich in der Lage sein, dies zu tun. Mit einem Verweis, ist es nicht in der Lage sein zu erwarten, dies zu tun.
(jedoch durch knifflige Dinge zu tun, ist es noch möglich ist, eine NULL in einen Referenz Parameter zu übergeben. Sie können erwarten, dass die genannte Funktion in diesem Fall abstürzen.)
Eine weitere Konvention ist, dass, wenn Sie einen Zeiger in eine Funktion übergeben, kann die Funktion über den Zeiger Besitz des Objekts zu nehmen (vor allem in einer COM-ähnlichen Bezug gezählt Umgebung). Wenn Sie einen Verweis übergeben, dann kann die aufgerufene Funktion erwarten, dass das Objekt für die Dauer des Funktionsaufrufes zu verwenden, aber nicht einen Zeiger auf das Objekt für die spätere Verwendung zu halten.
Der andere Unterschied zwischen Zeiger und Referenzen ist, dass es angedeutet wird, dass Sie eine Referenz nicht halten, es sei denn Sie ein zu einem Konstruktor übergeben. Passing Zeiger kann bedeuten, dass ein Objekt auf es für eine Weile halten könnte, wie ein zusammengesetztes Muster-Objekt.
Ein guter Grund, warum ich Zeiger und nicht die Referenzen in meine C ++ Anwendungen verwenden, ist die Lesbarkeit. Wenn Sie einen Zeiger verwenden sehen Sie, was wirklich geschieht, und wenn Zeiger die Syntax sagt Ihnen mit, was wirklich passiert ist.
Das Gleiche gilt für "0" oder "NULL". Ich ziehe mit „NULL“, auf diese Weise 3 Monate später, als ich einen Code zu sehen, die wie folgt aussieht:
somevar_1 = 0;
somevar_2 = NULL;
Ich weiß, dass somevar_1
ist ein int
(oder float
) und somevar_2
ist eine Art Zeiger.