c ++ * vs & in Funktionsdeklaration [doppelt]

9

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%     
Paul Tarjan 04.07.2009, 08:44
quelle

5 Antworten

13

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.

    
Mykola Golubyev 04.07.2009, 08:50
quelle
6

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.

    
MahlerFive 04.07.2009 08:56
quelle
3

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.

    
Greg Hewgill 04.07.2009 08:53
quelle
1

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.

    
quamrana 04.07.2009 09:10
quelle
0

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.

    
elcuco 04.07.2009 13:37
quelle