Es gibt noch viele andere Feinheiten, die die Korrektheit von const in C++ betreffen. Ich nehme an, die Frage bezog sich hier einfach auf C, aber ich werde einige verwandte Beispiele anführen, da das Thema C++ ist:
-
Sie übergeben oft große Argumente wie Zeichenketten als TYPE const &
die verhindert, dass das Objekt geändert oder kopiert wird. Beispiel:
TYPE& TYPE::operator=(const TYPE &rhs) { ... return *this; }
Aber TYPE & const
ist bedeutungslos, da Referenzen immer const sind.
-
Sie sollten Klassenmethoden, die die Klasse nicht verändern, immer als const
aufzurufen, sonst können Sie die Methode nicht aus einer TYPE const &
Hinweis. Beispiel:
bool TYPE::operator==(const TYPE &rhs) const { ... }
-
Es gibt häufig Situationen, in denen sowohl der Rückgabewert als auch die Methode const sein sollten. Beispiel:
const TYPE TYPE::operator+(const TYPE &rhs) const { ... }
Const-Methoden dürfen nämlich keine klasseninternen Daten als Verweis auf Non-Const zurückgeben.
-
Infolgedessen muss man oft sowohl eine const- als auch eine non-const-Methode mit const-Überladung erstellen. Wenn Sie zum Beispiel definieren T const& operator[] (unsigned i) const;
, dann wollen Sie wahrscheinlich auch die nicht-konstante Version, die durch gegeben ist:
inline T& operator[] (unsigned i) { return const_cast<char&>( static_cast<const TYPE&>(*this)[](i) ); }
Afaik gibt es in C keine Konst-Funktionen, Nicht-Mitglieder-Funktionen können in C++ selbst nicht konstant sein, Konst-Methoden können Seiteneffekte haben, und der Compiler kann keine Konst-Funktionen verwenden, um doppelte Funktionsaufrufe zu vermeiden. In der Tat, selbst eine einfache int const &
Referenz kann der Wert, auf den sie sich bezieht, an anderer Stelle geändert werden.
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/