C++11 auto-Deklaration mit und ohne Zeiger Feststellung
Was ist der Unterschied zwischen den Arten von bar1
und bar2
?
int foo = 10;
auto bar1 = &foo;
auto *bar2 = &foo;
Wenn beide bar1
und bar2
sind int*
, macht es Sinn zu schreiben, der Zeiger Feststellung (*
) in der bar2
Erklärung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Erklärungen sind genau gleichwertig.
auto
funktioniert (fast) das gleiche wie Vorlage Typ Abzug. Putting die Sterne explizit macht den code ein wenig leichter zu Lesen, und macht dem Programmierer bewusst, dassbar2
ist ein Zeiger.Mit
auto *
"Dokumente Absicht". Undauto *p = expr;
kann abgeleitet werden, nur dann korrekt, wennexpr
gibt Zeiger. Beispiel:In diesem Beispiel beide
bar1
undbar2
sind die gleichen. Es ist eine Frage der persönlichen Vorliebe, aber ich würde sagen, dassbar2
ist einfacher zu Lesen.Jedoch, dies gilt nicht für Referenzen, wie gesehen, in dieser Beispiel:
Gibt es einen großen Unterschied, wenn Sie
const
Qualifier:Als andere sagten, Sie erzeugen den gleichen code. Der Stern wird in Zeile Lärm (und macht es schwieriger zu wechseln von raw-Pointern, smart-Pointer, wenn zum Beispiel
&foo
wird immer ersetzt durchget_foo()
). Wenn Sie wollen, explizit genannt werden, dann mit allen Mitteln, ausdrücklich; aber wenn Sie mit Typ-Inferenz, lassen Sie den compiler seinen job tun. Fehlende Sternchen bedeutet nicht, dass ein Objekt nicht mehr einen Zeiger.*
kann den code besser lesbar, kann aber die Wartung erschwert. Ich persönlich finde, der größte Vorteil vonauto
zu lindern, ist die Wartung mehr noch als die Reduzierung der Eingabe oder Erhöhung der Lesbarkeit.Ist es egal, wie weit die interpretation der C++ - code geht; Sie können schreiben, was Sie wollen. Jedoch, es ist eine Frage des Stils und der Lesbarkeit: im Allgemeinen sollten Sie nicht verstecken, Zeiger -, Referenz-und CV-Qualifizierer und vielleicht sogar smart-Pointer-Typ-Aliase, denn es macht es schwieriger für den Leser zu verstehen, dass das ist, was Los ist. Typ-Aliase Paket sollte die semantisch relevanten Inhalte, in der Erwägung, dass Qualifikation und Modifikatoren sollten sichtbar bleiben. Also lieber die folgenden:
Und nicht sagen:
Beachten Sie auch Referenz-Qualifier (im Gegensatz zu Zeigern) wirklich ändern Sie den Typ der variable wird deklariert, Sie sind also nicht optional:
Schließlich hinzufügen explicit const-Zeiger Qualifikationen kann helfen, const-correctness. Betrachten Sie das nächste Beispiel, in dem ein container enthält Zeiger-zu-veränderlich, aber wir benötigen nur const-Zugriff. Nur
auto *
würde ableiten, die einen Zeiger auf veränderliche, die wir vermeiden können, indem Sie sagen:const
ausdrücklich:MyFn
Rückgabetyp istint
,auto*p = fn(x, -x)
nicht kompilieren (Dank*
, sonst sollten wir wartenp->Create()
für den Fehler) 🙂 .