2010-07-14 24 views
45

Zum Beispiel istconst int = int const?

int const x = 3; 

gültige Code?

Wenn ja, bedeutet es das gleiche wie

const int x = 3; 

?

+0

zumindest in MSVC – Andrey

+1

Was sagt der Compiler? –

+12

@Hamish: einige Compiler akzeptieren alle Arten von ungültigem Code; Der einzige Weg, um sicher zu sein, dass etwas gültig ist, ist, in den Standard zu schauen oder zu fragen. –

Antwort

87

Sie sind beide gültigen Code und sie sind beide gleichwertig. Für einen Zeigertyp sind sie zwar beide gültig, aber nicht äquivalent.

Deklariert 2 Ints, die konstant sind:

int const x1 = 3; 
const int x2 = 3; 

deklariert einen Zeiger, dessen Daten nicht durch den Zeiger geändert werden:

const int *p = &someInt; 

erklärt, einen Zeiger, der nicht auf etwas anderes geändert werden kann Punkt:

int * const p = &someInt; 
+2

Und 'const int * const p = & someInt;' würde Ihnen einen Zeiger geben, der nicht auf einen Wert geändert werden kann, der nicht geändert werden kann, wenn ich mich nicht irre. – JAB

+0

@JAB: Ja, es gibt Ihnen einen Zeiger, der nicht geändert werden kann, zusätzlich zu Daten, die innerhalb des Zeigers durch diesen Zeiger nicht geändert werden können. –

+58

Das Muster wird hier deutlich, wenn die Definitionen ** rückwärts gelesen werden. Zum Beispiel: '[const int *]' = ein Zeiger ('*') auf ein 'int', das' const' ist. '[int * const]' = ein 'const' Zeiger (' * ') auf ein' int'. – stakx

15

Ja, das ist genau das gleiche. Es gibt jedoch einen Unterschied in den Zeigern. Ich meine:

int a; 

// these two are the same: pointed value mustn't be changed 
// i.e. pointer to const value 
const int * p1 = &a; 
int const * p2 = &a; 

// something else -- pointed value may be modified, but pointer cannot point 
// anywhere else i.e. const pointer to value 
int * const p3 = &a; 

// ...and combination of the two above 
// i.e. const pointer to const value 
const int * const p4 = &a; 
+1

Dies ist die vollständigste Antwort. – anthropomorphic

3

Es ist das gleiche in Bedeutung und Gültigkeit.

Soweit ich weiß, wird const nur komplex, wenn es sich um Zeiger handelt.

int const * x; 
int * const x; 

sind unterschiedlich.

int const * x; 
const int * x; 

sind gleich.

28

Ja, sie sind gleich. Die Regel in C++ ist im Wesentlichen, dass const für den Typ auf der linken Seite gilt. Es gibt jedoch eine Ausnahme, wenn Sie es auf der äußersten linken Seite der Deklaration platzieren, gilt es für den ersten Teil des Typs.

Zum Beispiel in int const * haben Sie einen Zeiger auf eine konstante ganze Zahl. In int * const haben Sie einen konstanten Zeiger auf eine ganze Zahl. Sie können dies auf Zeiger auf Zeiger extrapolieren, und das Englisch kann verwirrend werden, aber das Prinzip ist das gleiche.

Für eine weitere Diskussion über die Verdienste, einen über den anderen zu tun, siehe my question zum Thema. Wenn Sie neugierig sind, warum die meisten Leute die Ausnahme verwenden, kann this FAQ entry von Stroustrup hilfreich sein.

+3

Genau was ich dachte. 'const int x' ist die Ausnahmeform. 'int const x' entspricht dem gleichen Muster wie' int * const x'. Wenn Sie einen konstanten Zeiger auf ein konstantes int benötigen, schreibe ich es normalerweise als int const const anstatt const int const. – Cogwheel

+0

@ Zahnrad - präzise. Wenn man sich erst einmal bewusst ist, dass die "normale" Form des "const" ganz links einen Ausnahmefall darstellt, stellt sich die Frage, auf welche Weise der Code auf lange Sicht tatsächlich klarer wird. Daher meine Frage http://stackoverflow.com/questions/988069/in-cis-is-const-after-type-id-acceptable –

+0

@ T.E.D. ** Die Regel in C++ besteht im Wesentlichen darin, dass const auf den Typ zu seiner Linken angewendet wird. ** Gibt es dafür ein Zitat von bekannten Programmiergurus oder nur eine Art von verständlichem Ding. Auch im "const int * p1". Es gibt nichts auf der linken Seite von const. Wie man die Regel in diesem Szenario anwendet. –

7

Von "Effective C++" Artikel 21

char *p    = "data"; //non-const pointer, non-const data 
const char *p  = "data"; //non-const pointer, const data 
char * const p  = "data"; //const pointer, non-const data 
const char * const p = "data"; //const pointer, const data 
+0

Der Kommentar zu Ihrem zweiten Element ist falsch, sollte nicht-const Zeiger, const Daten lesen. – Thomas

+0

@Thomas Zu langsam. ;) Behoben. Da dies ein exaktes Zitat aus dem Buch ist, sollte das in Ordnung sein. – Bart

Verwandte Themen