Einfache Verwendung von const
.
Die einfachste Verwendung ist die Deklaration einer benannten Konstante. Dazu deklariert man eine Konstante, als wäre sie eine Variable, fügt aber const
vor ihm. Man muss ihn sofort im Konstruktor initialisieren, denn man kann den Wert natürlich nicht nachträglich setzen, weil man ihn damit verändern würde. Zum Beispiel:
const int Constant1=96;
erzeugt eine Integer-Konstante, die fantasielos Constant1
mit dem Wert 96.
Solche Konstanten sind nützlich für Parameter, die im Programm verwendet werden, aber nach der Kompilierung des Programms nicht mehr geändert werden müssen. Dies hat für Programmierer einen Vorteil gegenüber dem C-Präprozessor #define
Befehl, da er vom Compiler selbst verstanden und verwendet wird und nicht nur vom Präprozessor in den Programmtext eingefügt wird, bevor er den Hauptcompiler erreicht, so dass Fehlermeldungen viel hilfreicher sind.
Es funktioniert auch mit Zeigern, aber man muss vorsichtig sein, wo const
um festzustellen, ob der Zeiger oder das, worauf er zeigt, konstant ist oder beides. Zum Beispiel:
const int * Constant2
erklärt, dass Constant2
ist ein variabler Zeiger auf eine konstante Ganzzahl und:
int const * Constant2
ist eine alternative Syntax, die dasselbe tut, während
int * const Constant3
erklärt, dass Constant3
ist ein konstanter Zeiger auf eine variable Ganzzahl und
int const * const Constant4
erklärt, dass Constant4
ist ein konstanter Zeiger auf eine konstante Ganzzahl. Grundsätzlich gilt 'const' für alles, was sich unmittelbar links von ihm befindet (außer wenn sich dort nichts befindet, in diesem Fall gilt es für alles, was sich unmittelbar rechts von ihm befindet).
ref: http://duramecho.com/ComputerInformation/WhyHowCppConst.html
256 Stimmen
Sie können die "Clockwise/Spiral Rule" um die meisten C- und C++-Deklarationen zu entschlüsseln.
76 Stimmen
cdecl.org ist eine großartige Website, die automatisch C-Deklarationen für Sie übersetzt.
11 Stimmen
@Calmarius: Beginnen Sie an der Stelle, an der sich der Typenname befindet bzw. befinden sollte, gehen Sie nach rechts, wenn Sie können, und nach links, wenn Sie müssen. .
int *(*)(char const * const)
. Beginnen Sie rechts von der eingeklammerten*
dann müssen wir nach links gehen:pointer
. Außerhalb der Klammern können wir nach rechts gehen:pointer to function of ...
. Dann müssen wir nach links gehen:pointer to function of ... that returns pointer to int
. Wiederholen Sie den Vorgang, um den Parameter zu erweitern (die...
) :pointer to function of (constant pointer to constant char) that returns pointer to int
. Wie würde die entsprechende einzeilige Erklärung in einer leicht lesbaren Sprache wie Pascal aussehen?3 Stimmen
@MarkKCowan In Pascal würde es etwa so lauten
function(x:^char):^int
. Dort sind Funktionstypen implizit ein Zeiger auf eine Funktion, so dass keine Notwendigkeit besteht, sie zu spezifizieren, und Pascal erzwingt keine const-Korrektheit. Es kann von links nach rechts gelesen werden.0 Stimmen
@Calmarius: In Pascal können komplexere Typen jedoch oft nicht in einem einzigen Ausdruck dargestellt werden, sondern müssen durch die Deklaration verschiedener einfacher Sub-Type-Ausdrücke zusammengesetzt werden.
13 Stimmen
Das erste, was links von "const" steht, ist das, was konstant ist. Wenn "const" das ist, was am weitesten links steht, dann ist das erste, was rechts davon steht, das, was konstant ist.
0 Stimmen
Obwohl viele gute Antworten gegeben werden, scheint es, dass der Teil der Frage, in dem es um die Frage geht, nicht beantwortet wird: "Übergabe an Funktionen" noch nicht wirklich beantwortet ist?
0 Stimmen
Ich frage mich z.B. immer noch, ob es jemals sinnvoll ist, eine Funktionsdeklaration f(const Class * const obj) anstelle von f(const Class * obj) zu haben? Bringt das zweite const in der ersten Deklaration überhaupt etwas? Ich würde sagen nein, da der Zeiger ohnehin als Wert übergeben wird
0 Stimmen
Wie kommt es, dass Ihr Name angezeigt wird, es aber so aussieht, als hätten Sie Ihr Konto selbst gelöscht?
1 Stimmen
ISO C++ FAQ : Was ist der Unterschied zwischen
const X* p
,X* const p
yconst X* const p
?0 Stimmen
Cdecl.org verwendet eine alte Version von cdecl; eine Version von cdecl, die modernes C und C++ versteht, finden Sie hier: github.com/paul-j-lucas/cdecl
0 Stimmen
@MarkKCowan Können Sie bitte einen Blick darauf werfen stackoverflow.com/questions/70921574/