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)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top