2013-12-18 11 views
7

Ich habe den folgenden Code:Const vor oder nach dem Typ?

string const& operator[] (size_t index) const { return elems[index]; } 

sollte es nicht sein:

const string& 

?

+5

Hier macht es keinen Unterschied. – Rapptz

+0

In seiner reinsten Form sollte es darauf ankommen, die Dinge konsistent zu halten. Die Tatsache, dass es auf der linken Seite gehen kann, ist wirklich die Ausnahme. Das heißt, ich persönlich bevorzuge links. – chris

+0

Ich denke, es ist einfacher, Typnamen zu lesen, wenn Sie es auf der rechten Seite setzen, aber es macht keinen Unterschied. – Simple

Antwort

16

Cv-Qualifier wie const gelten für alles, was links von ihnen ist, es sei denn, es gibt nichts, in diesem Fall gelten sie für das Recht. Für string const& gilt die const für die string zu seiner Linken. Für const string& gilt die const für die string zu seiner Rechten. Das heißt, sie sind beide Referenzen auf conststring, so dass es in diesem Fall keinen Unterschied macht.

Einige Leute bevorzugen es auf der linken Seite (wie const int), weil es von links nach rechts liest. Manche Leute ziehen es vor, es auf der rechten Seite zu haben (wie int const), um die Verwendung des Sonderfalles zu vermeiden (int const * const ist konsistenter als const int* const, zum Beispiel).

+0

Was ist 'const int * const' und' int const * const' ....? – Sangram

+0

@ user2745266 Sie sind beide "const" Zeiger auf 'const'' int'. –

+0

Danke für Ihre Antwort. Was ich fragen wollte, war, wie beide "const" in diesen beiden Fällen angewendet werden (welcher für int und welcher für Zeiger ist). Vielleicht hätte ich auf die richtige Weise fragen sollen. Vielen Dank. – Sangram

3

Es funktioniert in diesem Zusammenhang, und es ist eine Frage der persönlichen Präferenz und Kodierung Konventionen.

Einige Programmierer bevorzugen, es nach den Namen des Typs zu setzen, so dass es mit anderen Verwendungen von const konsistenter ist. wenn Sie einen Zeiger sind erklärt zum Beispiel, wo der Zeiger selbst (und nicht die spitze zu geben) ist const zu sein, müssen Sie es nach dem Sterne setzen:

string * const ptr; 

Und falls du bist eine const Memberfunktion deklarieren, muss es nach der Funktionsdeklaration gehen; Beispiel:

class Foo 
{ 
    void func() const; 
}; 
5

Die const auf beiden Seiten des Datentypen sein kann, so:

const int *“ ist dasselbe wie „int const *

const int * const“ ist dasselbe wie „int const * const

int *ptr;   // ptr is pointer to int 
int const *ptr;  // ptr is pointer to const int 
int * const ptr;  // ptr is const pointer to int 
int const * const ptr; // ptr is const pointer to const int 
int ** const ptr;  // ptr is const pointer to a pointer to an int 
int * const *ptr;  // ptr is pointer to a const pointer to an int 
int const **ptr;  // ptr is pointer to a pointer to a const int 
int * const * const ptr; // ptr is const pointer to a const pointer to an int 

Die Grundregel ist const applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it.

Verwandte Themen