C++
Variablendeklarationsschlüsselwörter
Suche…
const
Einen Typbezeichner; Bei Anwendung auf einen Typ wird die const-qualifizierte Version des Typs erstellt. Weitere Informationen zur Bedeutung von const
Sie unter const-Schlüsselwort .
const int x = 123;
x = 456; // error
int& r = x; // error
struct S {
void f();
void g() const;
};
const S s;
s.f(); // error
s.g(); // OK
decltype
Gibt den Typ seines Operanden aus, der nicht ausgewertet wird.
Wenn der Operand
e
ein Name ohne zusätzliche Klammern ist, dann istdecltype(e)
der deklarierte Typ vone
.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
Wenn der Operand
e
ein Klassenmitgliedszugriff ohne zusätzliche Klammern ist, dann istdecltype(e)
der deklarierte Typ des Mitglieds, auf das zugegriffen wird.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
In allen anderen Fällen liefert
decltype(e)
sowohl den Typ als auch die Wertkategorie des Ausdruckse
wie folgt:- Wenn
e
ein lWert vom TypT
, dann istdecltype(e)
T&
. - Wenn
e
ein x-Wert vom TypT
, istdecltype(e)
T&&
. - Wenn
e
ein Wert vom TypT
, dann ist der Typdecltype(e)
T
Dies schließt den Fall mit äußeren Klammern ein.
int f() { return 42; } int& g() { static int x = 42; return x; } int x = 42; decltype(f()) a = f(); // a has type int decltype(g()) b = g(); // b has type int& decltype((x)) c = x; // c has type int&, since x is an lvalue
- Wenn
Das spezielle Formular decltype(auto)
leitet den Typ einer Variablen von ihrem Initialisierer oder den Rückgabetyp einer Funktion aus den return
Anweisungen in ihrer Definition ab, wobei sie die decltype
von decltype
und nicht die von auto
.
const int x = 123;
auto y = x; // y has type int
decltype(auto) z = x; // z has type const int, the declared type of x
unterzeichnet
Ein Schlüsselwort, das Teil bestimmter Integer-Typnamen ist.
- Wenn es alleine verwendet wird, ist
int
impliziert, so dasssigned
,signed int
undint
vom gleichen Typ sind. - In Kombination mit
char
ergibt sich der Typsigned char
, der sich vonchar
, auch wennchar
signiert ist.signed char
Zeichen umfasst mindestens -127 bis +127. - In Kombination mit
short
,long
oderlong long
ist es überflüssig, da diese Typen bereits signiert sind. -
signed
kann nicht mitbool
,wchar_t
,char16_t
oderchar32_t
.
Beispiel:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
ohne Vorzeichen
Ein Typbezeichner, der die vorzeichenlose Version eines Integer-Typs anfordert.
- Wenn es alleine verwendet wird, ist
int
impliziert, also istunsigned
Typ derselbe Typ wieunsigned int
. - Der Typ
unsigned char
unterscheidet sich vom Typchar
, auch wennchar
unsigniert ist. Es kann ganze Zahlen bis zu 255 enthalten. -
unsigned
kann auch mitshort
,long
oderlong long
kombiniert werden. Es kann nicht mitbool
,wchar_t
,char16_t
oderchar32_t
.
Beispiel:
char invert_case_table[256] = { ..., 'a', 'b', 'c', ..., 'A', 'B', 'C', ... };
char invert_case(char c) {
unsigned char index = c;
return invert_case_table[index];
// note: returning invert_case_table[c] directly does the
// wrong thing on implementations where char is a signed type
}
flüchtig
Eine Typqualifikation; Bei Anwendung auf einen Typ wird die volatile-qualifizierte Version des Typs erstellt. Flüchtige Qualifikation spielt die gleiche Rolle wie const
Qualifikation in dem Typsystem, aber volatile
nicht daran hindert , Objekte, verändert; stattdessen zwingt der Compiler alle Zugriffe auf solche Objekte als Nebeneffekte.
Wenn im Beispiel unten, memory_mapped_port
nicht flüchtig, so könnte der Compiler die Funktion optimieren , so dass es nur die letzte Schreib führt, was falsch wäre , wenn sizeof(int)
ist größer als 1. Die volatile
Qualifikation Kräfte , um alles zu behandeln sizeof(int)
schreibt als verschiedene Nebenwirkungen und führt sie daher alle (in Reihenfolge) aus.
extern volatile char memory_mapped_port;
void write_to_device(int x) {
const char* p = reinterpret_cast<const char*>(&x);
for (int i = 0; i < sizeof(int); i++) {
memory_mapped_port = p[i];
}
}