C++
Nyckelord med variabel deklaration
Sök…
const
En typspecifikation; när den tillämpas på en typ, producerar den const-kvalificerade versionen av typen. Se const nyckelord för information om betydelsen av 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
Ger typ av operand, som inte utvärderas.
Om operand
e
är ett namn utan ytterligare parenteser, ärdecltype(e)
den deklarerade typen ave
.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
Om operand
e
är en klassmedlemstillträde utan några extra parenteser, ärdecltype(e)
den deklarerade typen av medlem som åtkomst till.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
I alla andra fall ger
decltype(e)
både typen och värdekategorin för uttryckete
, enligt följande:- Om
e
är en lvalue av typT
, ärdecltype(e)
T&
. - Om
e
är en xvalue av typT
, ärdecltype(e)
T&&
. - Om
e
är en uppskattning av typT
, ärdecltype(e)
T
Detta inkluderar fallet med främmande parenteser.
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
- Om
Den speciella formen decltype(auto)
härleder typen av en variabel från dess initierare eller retur typ av funktion från return
uttalanden i sin definition, med hjälp av typ avdragsregler för decltype
snarare än 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
signerad
Ett nyckelord som är en del av vissa namn på heltalstyp.
- När den används ensam antyds
int
, så attsigned
,signed int
ochint
är samma typ. - I kombination med
char
ger du den typsigned char
, som är en annan typ änchar
, även omchar
är signerad.signed char
har ett intervall som inkluderar minst -127 till +127, inklusive. - I kombination med
short
,long
ellerlong long
är det överflödigt eftersom dessa typer redan är signerade. -
signed
kan inte kombineras medbool
,wchar_t
,char16_t
ellerchar32_t
.
Exempel:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
osignerad
En typspecifikation som begär den osignerade versionen av en heltalstyp.
- När den används ensam antyds
int
, såunsigned
är samma typ somunsigned int
. - Typen
unsigned char
skiljer sig frånchar
, även omchar
är osignerad. Det kan innehålla heltal upp till minst 255. -
unsigned
kan också kombineras medshort
,long
ellerlong long
. Det kan inte kombineras medbool
,wchar_t
,char16_t
ellerchar32_t
.
Exempel:
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
}
flyktig
En typkvalificering; när den tillämpas på en typ, producerar den flyktiga kvalificerade versionen av typen. Flyktig kvalifikation spelar samma roll som const
kvalificering i typsystemet, men volatile
förhindrar inte att objekt kan modifieras; istället tvingar den kompilatorn att behandla alla åtkomst till sådana objekt som biverkningar.
I exemplet nedan, om memory_mapped_port
inte var flyktiga, skulle kompilatorn kunna optimera funktionen så att den endast utför den slutliga skrivningen, vilket skulle vara fel om sizeof(int)
är större än 1. Den volatile
kvalificeringen tvingar den att behandla alla sizeof(int)
skriver som olika biverkningar och därmed utföra dem alla (i ordning).
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];
}
}