
Jack Reza
Was wäre eine bessere Vorgehensweise, wenn Sie einer Funktion die ursprüngliche Variable geben, mit der sie arbeiten soll:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
oder:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
IOW: Gibt es einen Grund, einen dem anderen vorzuziehen?

Nils Pipenbrink
Meine Faustregel lautet:
Verwenden Sie Zeiger, wenn Sie mit ihnen Zeigerarithmetik durchführen wollen (zB die Zeigeradresse erhöhen, um ein Array zu durchlaufen) oder wenn Sie jemals einen NULL-Zeiger übergeben müssen.
Verwenden Sie ansonsten Referenzen.

Johann Gell
Ich denke wirklich, dass Sie davon profitieren werden, wenn Sie die folgenden Codierungsrichtlinien für Funktionsaufrufe festlegen:
-
Wie an allen anderen Orten immer sein const
-Korrekt.
- Hinweis: Das bedeutet unter anderem, dass nur out-Werte (siehe Punkt 3) und als Wert übergebene Werte (siehe Punkt 4) fehlen können
const
Bezeichner.
-
Übergeben Sie einen Wert nur per Zeiger, wenn der Wert 0/NULL im aktuellen Kontext eine gültige Eingabe ist.
-
Begründung 1: Als ein AnruferSie sehen das, was auch immer Sie passieren muss sein in einem brauchbaren Zustand.
-
Begründung 2: Als namensdu weißt, was auch immer reinkommt ist in einem brauchbaren Zustand. Daher muss für diesen Wert keine NULL-Prüfung oder Fehlerbehandlung durchgeführt werden.
-
Begründung 3: Begründung 1 und 2 werden sein Compiler erzwungen. Fangen Sie Fehler immer zur Kompilierzeit ab, wenn Sie können.
-
Wenn ein Funktionsargument ein Out-Wert ist, übergeben Sie es als Referenz.
- Begründung: Wir wollen Punkt 2 nicht brechen …
-
Wählen Sie “Pass by Value” gegenüber “Pass by Const Reference” nur dann, wenn der Wert ein POD (Plain Old Datastructure) oder klein genug (speichermäßig) oder auf andere Weise billig genug (zeitlich) zum Kopieren ist.
- Begründung: Vermeiden Sie unnötige Kopien.
- Notiz: klein genug und billig genug sind nicht absolut messbar.

Aaron N. Tubbs
Das ist letztlich subjektiv. Die bisherige Diskussion ist nützlich, aber ich glaube nicht, dass es darauf eine richtige oder entscheidende Antwort gibt. Vieles hängt von den Stilrichtlinien und Ihren aktuellen Bedürfnissen ab.
Während es bei einem Zeiger einige unterschiedliche Fähigkeiten gibt (ob etwas NULL sein kann oder nicht), besteht der größte praktische Unterschied für einen Ausgabeparameter in der reinen Syntax. Googles C++ Style Guide (https://google.github.io/styleguide/cppguide.html#Reference_Arguments) verlangt beispielsweise nur Zeiger für Ausgabeparameter und erlaubt nur Verweise, die konstant sind. Der Grund liegt in der Lesbarkeit: Etwas mit Wertesyntax sollte keine semantische Zeigerbedeutung haben. Ich behaupte nicht, dass dies notwendigerweise richtig oder falsch ist, aber ich denke, der Punkt hier ist, dass es eine Frage des Stils ist, nicht der Korrektheit.
Zeiger
- Ein Zeiger ist eine Variable, die eine Speicheradresse enthält.
- Eine Zeigerdeklaration besteht aus einem Basistyp, einem * und dem Variablennamen.
- Ein Zeiger kann während der Lebensdauer auf eine beliebige Anzahl von Variablen zeigen
-
Ein Zeiger, der derzeit nicht auf einen gültigen Speicherplatz zeigt, erhält den Wert null (was null ist).
BaseType* ptrBaseType;
BaseType objBaseType;
ptrBaseType = &objBaseType;
-
Das & ist ein unärer Operator, der die Speicheradresse seines Operanden zurückgibt.
-
Dereferenzierungsoperator
int nVar = 7;
int* ptrVar = &nVar;
int nVar2 = *ptrVar;
wird verwendet, um auf den Wert zuzugreifen, der in der Variablen gespeichert ist, auf die der Zeiger zeigt.
-
Referenz
-
Eine Referenz (&) ist wie ein Alias für eine vorhandene Variable.
-
Eine Referenz (&) ist wie ein konstanter Zeiger, der automatisch dereferenziert wird.
-
Es wird normalerweise für Funktionsargumentlisten und Funktionsrückgabewerte verwendet.
-
Eine Referenz muss initialisiert werden, wenn sie erstellt wird.
-
Sobald eine Referenz auf ein Objekt initialisiert wurde, kann sie nicht geändert werden, um auf ein anderes Objekt zu verweisen.
-
Sie können keine NULL-Referenzen haben.
int i = 3; //integer declaration
int * pi = &i; //pi points to the integer i
int& ri = i; //ri is refers to integer i – creation of reference and initialization


Geben Sie hier die Bildbeschreibung ein

17. Juni 2015 um 7:29 Uhr
Kiley Hykawy
Wenn Sie einen Parameter haben, bei dem Sie möglicherweise das Fehlen eines Werts angeben müssen, ist es üblich, den Parameter zu einem Zeigerwert zu machen und NULL zu übergeben. Eine bessere Lösung ist in den meisten Fällen (aus Sicherheitssicht) die Verwendungsteigern::optional
// Sample method using optional as input parameter
void PrintOptional(const boost::optional<std::string>& optional_str)
{
if (optional_str)
{
cout << *optional_str << std::endl;
}
else
{
cout << "(no string)" << std::endl;
}
}
// Sample method using optional as return value
boost::optional<int> ReturnOptional(bool return_nothing)
{
if (return_nothing)
{
return boost::optional<int>();
}
return boost::optional<int>(42);
}

17. Juni 2015 um 7:29 Uhr
9900600cookie-checkZeiger vs. Referenzyes
Referenzen sind natürlich wertvoll, aber ich komme aus C, wo Zeiger überall sind. Man muss zuerst mit Zeigern vertraut sein, um den Wert von Referenzen zu verstehen.
– Jay D
8. Mai 2012 um 19:43 Uhr
Wie passt das zu einem Ziel wie referentielle Transparenz aus der funktionalen Programmierung? Was ist, wenn Sie möchten, dass Funktionen immer neue Objekte zurückgeben und den Status niemals intern ändern, insbesondere nicht von Variablen, die an die Funktion übergeben werden? Gibt es eine Möglichkeit, dieses Konzept immer noch mit Zeigern und Referenzen in einer Sprache wie C++ zu verwenden. (Beachten Sie, ich gehe davon aus, dass jemand bereits das Ziel der referenziellen Transparenz hat. Ich bin nicht daran interessiert, darüber zu sprechen, ob es ein gutes Ziel ist oder nicht.)
– Ely
30. September 2013 um 17:31 Uhr
Referenzen bevorzugen. Benutzerhinweise, wenn Sie keine Wahl haben.
– Ferruccio
5. Juli 2014 um 13:14 Uhr