C ++ Funktionen: Ampersand vs Sternchen
Lassen Sie uns sagen, Sie haben eine Funktion, die ändert eine variable.
Sollten Sie schreiben es so: void myfunc(int *a)
oder so void myfunc(int &a)
?
Den ehemaligen zwingt Sie dazu, rufen Sie die Funktion mit myfunc(&b)
so der Anrufer ist sich bewusst, dass b
wird geändert werden, aber das letztere ist kürzer und kann aufgerufen werden, einfach mit myfunc(b)
. Also, was ist besser zu verwenden? Gibt es etwas, was ich bin fehlt?
InformationsquelleAutor der Frage mpen | 2009-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zeiger (dh. der '*') sollte verwendet werden, wo die übergabe von "NULL" sinnvoll ist.
Zum Beispiel, könnten Sie mit einem NULL zu stellen, dass ein bestimmtes Objekt erstellt werden muss, oder dass eine bestimmte Maßnahme nicht ergriffen werden müssen.
Oder ob es überhaupt aufgerufen werden muss, die von nicht-C++ - code. (zB. für den Einsatz in shared libraries)
zB. Der libc-Funktion
time_t time (time_t *result);
Wenn
result
ist nicht NULL, wird die aktuelle Uhrzeit gespeichert werden. Aber wennresult
NULL ist, dann wird keine Aktion durchgeführt.Wenn die Funktion, die Sie schreiben muss nicht mit NULL als einen sinnvollen Wert dann durch Verweise (ie. mit dem '&') wahrscheinlich weniger verwirrend ist, vorausgesetzt, dass die Konvention, die das Projekt verwendet.
InformationsquelleAutor der Antwort Andrew Edgecombe
Wann immer möglich, ich Verweise über Zeiger. Der Grund dafür ist, dass es viel schwerer ist, zu Schrauben, bis eine Referenz als ein Zeiger. Menschen können immer übergeben Sie NULL, um einen Zeiger-Wert, aber es gibt keine solche Entsprechung zu einer Referenz.
Der einzige wirkliche Nachteil ist, dass es Referenz-Parameter in C++ haben einen Mangel an call-Ort-Dokumentation. Einige Leute glauben, dass es schwieriger zu verstehen, code (und ich Stimme zu weit). Ich in der Regel definieren Sie Folgendes in meinem code und verwenden Sie es für fake call Website-Dokumentation
Dies natürlich nicht durchsetzen nennen, Website-Dokumentation. Es stellt nur einen sehr lame Art und Weise der Dokumentation. Ich habe einige Experimente mit einer Vorlage, die erzwingt nennen, Website-Dokumentation. Dies ist mehr für Spaß als für die eigentliche Produktion code aber.
http://blogs.msdn.com/jaredpar/archive/2008/04/03/reference-values-in-c.aspx
InformationsquelleAutor der Antwort JaredPar
Ich glaube, ich würde disagre mit @bb und @JaredPar und ich lehnen Sie sich auf der gegenüberliegenden Seite des Zauns. Nach Jahren der Versuch, die Unterstützung anderer Völker C++ - code, habe ich oft Probleme lauern in nicht-offensichtliche Nebenwirkungen der Referenz-Argumente. Mit C#, ist es offensichtlich, da muss man Präfix-Typen der Argumente, mit 'ref'/'out', sondern Verweise sind potentiell verwirrend in C++. Also, ich mag Zeiger, weil es ist wirklich klar, etwas kommt zurück. Wenn Sie nicht wie die Punkte, C++ ist nicht für Sie.
InformationsquelleAutor der Antwort kenny
Komme ich unten auf der Zeiger Seite des Zauns, für Gründe, die hier und anderswo. Allerdings werde ich sagen, dass was auch immer Sie sich entscheiden, Sie müssen konsequent sein und dokumentieren es in Ihrem style guide.
Google C++ style guide Verbote nicht-const-Referenz Argumente.
InformationsquelleAutor der Antwort i_am_jorf
manchmal-Funktion übernehmen könnte, const-Zeiger und der Anrufer wird haben falsch zu denken, dass b geändert werden.
Meine Empfehlung - lieber Referenzen verwenden, überall wo es möglich ist (natürlich, wo es notwendig ist). Im Fall mit der Funktion argument - wir bekommen Vorteile:
- Verweise können nicht NULL sein - es hilft uns, Fehler zu vermeiden und unnötige behauptet oder überprüft.
- Referenzen haben nur eine Initialisierung und Funktion boody Sie immer wissen, was Sache Eingabeparameter Punkte.
Bin ich Betreuer auf große Projekt. Und in beiden Fällen bin ich auf der Suche auf die definition einer Funktion vor Aufruf sein. Natürlich, wenn ich auf der Suche auf die Funktion definition sehe ich Argumente, die definition von value, by reference, const-Referenz oder Zeiger.
Aber wie es scheint, Heiligen-Krieg-Frage, defferent Völker haben andere Ansicht zu diesem Punkt. E. g. google codding convension empfohlene Verwendung Zeigern in Argumente, die geändert werden können und dürfen nur const-Referenzen:
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments
InformationsquelleAutor der Antwort bayda
Ich wie durch Verweis übergeben wird, wenn die NULL keine Bedeutung, aber ich kann die Argumente für beide. Wenn Sie vorsichtig sind über die Codierung könnte man wohl beseitigen der zufälligen pass-by-reference Einwand, indem Sie sicher, dass Sie immer passen Sie Ihre Variablen per const-Referenz, zB:
Ist das eine Menge zusätzlichen code für wenig nutzen, obwohl. Als Kenny wies in C# befasst sich mit dieser von der gegenüberliegenden Seite (also eine bestimmte durch Verweis übergeben wird), aber das ist keine option für C++ (es sei denn, zum Beispiel, Sie schrieb Ihre Funktionen nehmen Sie ein Referenz-wrapper, so dass Ihre parameter, wie boost::ref(param)), z.B.:
Befestigung der Zeiger problem ist eher problematisch, obwohl... es gibt keine compile-Zeit-Weg um sicherzustellen, dass der Zeiger gültig ist, so dass Sie am Ende entweder Laufzeit Probleme für Zeiger Fragen, oder zur Zeit prüft, oder beides. Tis die Art von Zeigern.
Sowieso, das ist nur meine Meinung, für was es Wert ist.
InformationsquelleAutor der Antwort Nick
Etwas zu beachten, wenn Sie mit stl-funktoren, es ist einfacher, wenn der parameter entspricht der container Wert geben.
Dem obigen code ist viel härter, wenn foo nimmt Bar&
InformationsquelleAutor der Antwort
In einer idealen Welt kommt es darauf an, ob oder nicht der parameter ist ein optionaler Ausgang. Möchten Sie zulassen, dass der Aufrufer übergeben Sie NULL, wenn Sie nicht kümmern? Dann verwenden Sie einen Zeiger. Ansonsten wird eine Referenz ist eine bessere Wahl.
Beachten Sie, dass in beiden Fällen die Sprache macht es umständlich zu dokumentieren, ein output-parameter. Es ist viel besser, wenn die ganze Codebasis ist const-korrekt ist, dann kann der Benutzer davon ausgehen, dass alle nicht-const-Referenz oder ein Zeiger-parameter ist ein output.
InformationsquelleAutor der Antwort Dan Olson
Einen Unterschied, wie vorher schon erwähnt wurde, Sie können nicht übergeben Sie einen null-Verweis ist, aber Sie können übergeben Sie einen null-Zeiger.
Andere Sache, auch schon erwähnt, wenn Sie anrufen
f(a,b)
könnte es Verwirrung geben, wenn der Anrufer nicht weiß, dassf
könnte möglicherweise ändern Sie den Wert fürb
Jedoch noch ein weiteres Problem, das ist eher subtil, aber Ich lief noch in esist die Semantik von Referenzen.
Zeiger als Wert übergeben werden, aber keine Referenzen.
Was bedeutet, dass, wenn Sie übergeben einen parameter per Zeiger können Sie den Zeiger und stellen Sie es auf etwas anderes zeigen.
Bedenken Sie:
Aber, wenn die übergabe per Referenz, die Sie nicht ändern können, den Verweis zu finden, um einen anderen Wert. Sobald die Referenz gesetzt ist, kann es nicht geändert werden.
InformationsquelleAutor der Antwort hasen