
Mäuse
Es ist ziemlich allgemein bekannt, dass Zeiger semantisch korrekt deklariert werden
int *x;
anstatt
int* x;
Das liegt daran, dass C sieht *x
als int, nicht x
als int-Zeiger.
Dies lässt sich leicht demonstrieren durch
int* a, b;
wo a
ist ein int-Zeiger, während b
ist ein int.
Es gibt mindestens 5 doppelte Fragen zu Stack Overflow, die dieses Problem für Zeiger erörtern. Aber was ist mit Referenzen?

Alejandro Blasco
Bjarne Stroustrup sagt:
EIN typical C programmer
schreibt int *p
; und erklärt es *p is what is the int
Hervorhebung der Syntax und kann auf die Deklarationsgrammatik von C (und C++) verweisen, um für die Korrektheit des Stils zu argumentieren. Tatsächlich bindet das * in der Grammatik an den Namen p.
EIN typical C++ programmer
schreibt int* p;
und erklärt es p is a pointer to an int
Typ hervorheben. Tatsächlich ist der Typ von p int*. Ich bevorzuge eindeutig diese Betonung und sehe sie als wichtig an, um die fortgeschritteneren Teile von C++ gut zu nutzen.
Wenn Sie eine Zeigervariable oder ein Argument deklarieren, können Sie das Sternchen (oder das kaufmännische Und) entweder neben dem Typ oder dem Variablennamen platzieren.
Das Wichtigste ist, dies konsistent innerhalb einer einzigen Datei zu tun.
// These are fine, space preceding.
char *c;
const int &i;
// These are fine, space following.
char* c;
const int& i;
Bei der Recherche zu dieser Frage habe ich bereits die Antwort gefunden:
Das &
muss genauso geschrieben werden wie die *
.
Der Democode ähnelt dem Pointer-Demonstrationscode:
int main() {
int a = 0;
int b = 1;
int& ar = a, br = b;
br = 2;
return b;
}
Dies gibt 1 zurück, was bedeutet, dass ar
ist eine int-Referenz, während br
ist nur eine ganze Zahl.
Dank “template typedefs” können Sie mehrere Referenzen auf (wohl) nettere Weise deklarieren:
template<typename T> using ref = T&;
int a, b;
ref<int> ar = a, br = b;
10128000cookie-checkWas ist die semantisch genaue Position für das kaufmännische Und in C++-Referenzen?yes
Leerzeichen spielen keine Rolle, da sie während der Lexikphase übersprungen werden. Sie können null oder mehr Leerzeichen vor und null oder mehr Leerzeichen nach dem Sternchen haben. Beide deklarieren x als Zeiger, nicht als Referenz.
– Thomas Matthäus
31. März 2014 um 16:34 Uhr
@mic_e: Das ist exakt wozu dieser Knopf da ist. Wir haben sogar einen Post auf Meta, der es demonstriert: meta.stackexchange.com/questions/132886/… Leider wird dies oft als Versuch angesehen, mehr Wiederholungen zu erzielen, obwohl die Beantwortung Ihrer eigenen Frage sicherlich ermutigt wird.
– BoltClock
31. März 2014 um 16:35 Uhr
@Jens: Es ist ziemlich schrecklich, wenn man darüber nachdenkt … C ++ folgt einer völlig anderen Designphilosophie als C, was dazu führt
int& i
als guter Stil, aber aufgrund seiner Legacy-C-Kompatibilität verbirgt dieser “gute Stil” direkt die tatsächliche Semantik Ihres Codes …– Mäuse
31. März 2014 um 17:15 Uhr
Es ist definitiv schlechter Stil, aber jemand, der das Problem nicht recherchiert hat, wird automatisch davon ausgehen
int& a, b;
deklariert zwei Referenzen, und ich denke, das ist ein ernstes Problem, zumal der Compiler möglicherweise nicht einmal eine Warnung ausgibt.– Mäuse
31. März 2014 um 17:26 Uhr
Der Umgang mit mehreren Deklarationen auf diese Weise war a sehr schlecht Designwahl beim Erstellen der C-Sprache. Jetzt stecken wir damit fest, auch in C++. Es ist wahr, dass mit
int *i
passt besser zu dieser sprachsemantischen Regel, aber es ist eine schreckliche Regel. Der bessere Weg, damit umzugehen, besteht darin, (1) keine mehrfachen Deklarationen zuzulassen und (2) den Typ vom Bezeichner zu unterscheiden (zint* i
oderint& i
). Jeder mit den geringsten Kenntnissen in C/C++ kennt diese Regel, und deshalb müssen wir die Leute nicht daran erinnern, wir müssen sie nur vermeiden.– Michael Persson
31. März 2014 um 17:55 Uhr