Wann sollte ich meine Variablen als Zeiger gegenüber Objekten definieren, die als Referenz übergeben wurden? Sie kompilieren zur selben Sache in Assembly (zumindest Laufzeit asymptotisch) also wann soll ich welche verwenden?
%Vor%Meine Regel ist einfach: Verwenden Sie *, wenn Sie anzeigen möchten, dass der Wert optional ist und daher 0 sein kann.
Ausgenommen von der Regel: Alle _obj_s herum sind in Containern gespeichert und Sie möchten Ihren Code nicht hässlich aussehen lassen, indem Sie überall foo(*value);
anstelle von foo(value);
verwenden.
Also, um zu zeigen, dass der Wert nicht 0 sein kann, setzen Sie assert(value);
auf die Funktion begin.
Ich folge dem Google-Styleguide-Standard , da er für mich am sinnvollsten ist . Es heißt:
Innerhalb des Funktionsparameters listet alle auf Referenzen müssen const sein:
%Vor%Tatsächlich ist es eine sehr starke Konvention in Google-Code, die Argumente eingeben sind Werte oder const Referenzen während Ausgabeargumente sind Zeiger. Eingang Parameter können const Zeiger sein, aber wir erlauben niemals eine nicht-konstante Referenz Parameter.
Ein Fall, wenn Sie eine Eingabe wünschen Parameter, um ein Const-Zeiger zu sein, ist wenn Sie möchten betonen, dass die Argument wird nicht kopiert, also muss es existieren für die Lebensdauer des Objekts; Es ist normalerweise am besten, dies zu dokumentieren Kommentare auch. STL-Adapter wie z bind2nd und mem_fun erlauben dies nicht Referenzparameter, also müssen Sie deklariere Funktionen mit Zeiger Parameter auch in diesen Fällen.
Ein Grund, Zeiger zu verwenden, ist, wenn es sinnvoll ist, einen NULL
-Wert in die Funktion zu übergeben. Mit einem Zeiger wird erwartet, dass dies möglich ist. Mit einer Referenz wird nicht erwartet, dass dies möglich ist.
(Wenn Sie jedoch knifflige Dinge tun, ist es immer noch möglich, einen NULL in einen Referenzparameter zu übergeben. Sie können erwarten, dass die aufgerufene Funktion in diesem Fall abstürzt.)
Eine andere Konvention ist, dass wenn Sie einen Zeiger an eine Funktion übergeben, die Funktion den Zeiger verwenden kann, um das Objekt zu übernehmen (besonders in einer COM-ähnlichen Umgebung mit Referenzzählung). Wenn Sie eine Referenz übergeben, kann die aufgerufene Funktion erwarten, dass sie das Objekt für die Dauer des Funktionsaufrufs verwendet, aber keinen Zeiger auf das Objekt für die spätere Verwendung behält.
Der andere Unterschied zwischen Zeigern und Referenzen besteht darin, dass Sie nicht an einer Referenz festhalten, es sei denn, Sie übergeben eine an einen Konstruktor. Das Übergeben von Zeigern kann bedeuten, dass ein Objekt für eine Weile wie ein zusammengesetztes Musterobjekt daran festhalten kann.
Ein guter Grund, warum ich Zeiger und keine Referenzen in meinen C ++ - Anwendungen verwende, ist die Lesbarkeit. Wenn Sie einen Zeiger verwenden, sehen Sie, was wirklich passiert, und wenn Sie Zeiger verwenden, sagt Ihnen die Syntax, was wirklich passiert.
Gleiches gilt für "0" oder "NULL". Ich verwende lieber "NULL", also 3 Monate später, wenn ich einen Code sehe, der wie folgt aussieht:
%Vor% Ich weiß, dass somevar_1
ein int
(oder float
) und somevar_2
eine Art Zeiger ist.
Tags und Links c++ reference pointers pass-by-reference