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
eein 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
eein 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 constIn allen anderen Fällen liefert
decltype(e)sowohl den Typ als auch die Wertkategorie des Ausdrucksewie folgt:- Wenn
eein lWert vom TypT, dann istdecltype(e)T&. - Wenn
eein x-Wert vom TypT, istdecltype(e)T&&. - Wenn
eein 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
intimpliziert, so dasssigned,signed intundintvom gleichen Typ sind. - In Kombination mit
charergibt sich der Typsigned char, der sich vonchar, auch wenncharsigniert ist.signed charZeichen umfasst mindestens -127 bis +127. - In Kombination mit
short,longoderlong longist es überflüssig, da diese Typen bereits signiert sind. -
signedkann nicht mitbool,wchar_t,char16_toderchar32_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
intimpliziert, also istunsignedTyp derselbe Typ wieunsigned int. - Der Typ
unsigned charunterscheidet sich vom Typchar, auch wenncharunsigniert ist. Es kann ganze Zahlen bis zu 255 enthalten. -
unsignedkann auch mitshort,longoderlong longkombiniert werden. Es kann nicht mitbool,wchar_t,char16_toderchar32_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];
}
}