C++
Słowa kluczowe deklaracji zmiennej
Szukaj…
const
Specyfikator typu; po zastosowaniu do typu, tworzy stałą wersję typu. Zobacz słowo kluczowe const, aby uzyskać szczegółowe informacje na temat znaczenia const .
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
Daje typ swojego operandu, który nie jest analizowany.
Jeśli operand
ejest nazwą bez dodatkowych nawiasów, todecltype(e)jest zadeklarowanym typeme.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>Jeśli operand
ejest dostępem do klasy bez żadnych dodatkowych nawiasów, todecltype(e)jest zadeklarowanym typem dostępnego elementu.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is constWe wszystkich innych przypadkach
decltype(e)daje zarówno typ, jak i kategorię wartości wyrażeniae, jak następuje:- Jeśli
ejest wartością typuT, todecltype(e)toT&. - Jeśli
ejest wartością x typuT, todecltype(e)toT&&. - Jeśli
ejest wartością typuT, todecltype(e)toT
Obejmuje to przypadek z obcymi nawiasami.
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- Jeśli
Specjalna forma decltype(auto) dedukuje typ zmiennej z jej inicjalizatora lub typ zwracany przez funkcję z instrukcji return w swojej definicji, używając reguł dedukcji typu dla decltype zamiast reguł 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
podpisany
Słowo kluczowe, które jest częścią niektórych nazw typów całkowitych.
- Gdy jest używany samodzielnie,
intjest domyślny, więcsigned,signed intiintsą tego samego typu. - W połączeniu z
char, zwraca typsigned char, który jest innym typem niżchar, nawet jeślicharjest również podpisany.signed charma zakres, który obejmuje co najmniej -127 do +127 włącznie. - W połączeniu z
short,longlublong longjest zbędny, ponieważ te typy są już podpisane. -
signednie można łączyć zbool,wchar_t,char16_tlubchar32_t.
Przykład:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
niepodpisany
Specyfikator typu, który żąda niepodpisanej wersji typu liczby całkowitej.
- W przypadku użycia samego,
intjest implikowane, więcunsignedjest tego samego typu, counsigned int. - Typ
unsigned charróżni się od typu bezchar, nawet jeślicharjest bez znaku. Może pomieścić liczby całkowite do co najmniej 255. -
unsignedmożna również łączyć zshort,longlublong long. Nie można go łączyć zbool,wchar_t,char16_tlubchar32_t.
Przykład:
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
}
lotny
Kwalifikator typu; po zastosowaniu do typu, tworzy wersję typu spełniającą warunki lotności. Kwalifikacja lotna odgrywa taką samą rolę jak kwalifikacja const w systemie typów, ale volatile nie zapobiega modyfikacji obiektów; zamiast tego zmusza kompilator do traktowania wszystkich dostępów do takich obiektów jako skutków ubocznych.
W poniższym przykładzie, gdyby memory_mapped_port nie był lotny, kompilator mógłby zoptymalizować funkcję, tak aby wykonywał tylko końcowy zapis, co byłoby niepoprawne, gdyby sizeof(int) był większy niż 1. volatile kwalifikacja zmusza ją do traktowania wszystkich sizeof(int) pisze jako różne efekty uboczne i dlatego wykonuje je wszystkie (w kolejności).
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];
}
}