Szukaj…
Wprowadzenie
Tradycyjnie dosłowność jest wyrażeniem oznaczającym stałą, której typ i wartość są widoczne po jej pisowni. Na przykład 42
jest dosłowne, podczas gdy x
nie jest, ponieważ trzeba zobaczyć jego deklarację, aby poznać jej typ i przeczytać poprzednie wiersze kodu, aby poznać jego wartość.
Jednak C ++ 11 dodał także literały zdefiniowane przez użytkownika , które nie są literałami w tradycyjnym znaczeniu, ale mogą być użyte jako skrót dla wywołań funkcji.
prawdziwe
Słowo kluczowe oznaczające jedną z dwóch możliwych wartości typu bool
.
bool ok = true;
if (!f()) {
ok = false;
goto end;
}
fałszywy
Słowo kluczowe oznaczające jedną z dwóch możliwych wartości typu bool
.
bool ok = true;
if (!f()) {
ok = false;
goto end;
}
nullptr
Słowo kluczowe oznaczające stałą wskaźnika zerowego. Można go przekonwertować na dowolny wskaźnik lub typ wskaźnika na element członkowski, uzyskując pusty wskaźnik typu wynikowego.
Widget* p = new Widget();
delete p;
p = nullptr; // set the pointer to null after deletion
Zauważ, że nullptr
nie jest wskaźnikiem. Typ nullptr
jest podstawowym typem znanym jako std::nullptr_t
.
void f(int* p);
template <class T>
void g(T* p);
void h(std::nullptr_t p);
int main() {
f(nullptr); // ok
g(nullptr); // error
h(nullptr); // ok
}
to
W ciągu funkcję składową klasy, Hasło this
jest wskaźnik do instancji klasy, na których funkcja została wywołana. this
nie może być stosowany w statycznej funkcji składowej.
struct S {
int x;
S& operator=(const S& other) {
x = other.x;
// return a reference to the object being assigned to
return *this;
}
};
Typ this
zależy cv kwalifikacji funkcji użytkownik: Jeżeli X::f
znaczy const
, wówczas typ this
ciągu f
jest const X*
, więc this
nie może być wykorzystany do modyfikacji bez statycznych elementów danych z poziomu const
funkcja członka. Podobnie dziedziczy this
volatile
kwalifikację z funkcji, w której się pojawia.
można this
również użyć w inicjatorze nawiasów klamrowych lub równości dla niestatycznego elementu danych.
struct S;
struct T {
T(const S* s);
// ...
};
struct S {
// ...
T t{this};
};
this
jest rvalue, więc nie można przypisać.
Dosłowne liczby całkowite
Literał całkowity jest podstawowym wyrażeniem formy
- dziesiętny-dosłowny
Jest to niezerowa cyfra dziesiętna (1, 2, 3, 4, 5, 6, 7, 8, 9), po której następuje zero lub więcej cyfr dziesiętnych (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
int d = 42;
- ósemkowo-dosłowny
Jest to cyfra zero (0), po której następuje zero lub więcej cyfr ósemkowych (0, 1, 2, 3, 4, 5, 6, 7)
int o = 052
- szesnastkowy
Jest to sekwencja znaków 0x lub sekwencja znaków 0X, po której następuje jedna lub więcej cyfr szesnastkowych (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C , d, D, e, E, f, F)
int x = 0x2a;
int X = 0X2A;
- binarno-dosłowny (od C ++ 14)
Jest to sekwencja znaków 0b lub sekwencja znaków 0B, po której następuje jedna lub więcej cyfr binarnych (0, 1)
int b = 0b101010; // C++14
Sufiks liczb całkowitych, jeśli jest podany, może zawierać jeden lub oba z następujących elementów (jeśli oba są podane, mogą występować w dowolnej kolejności:
- sufiks bez znaku (znak u lub znak U)
unsigned int u_1 = 42u;
- długi przyrostek (znak l lub znak L) lub długi-długi przyrostek (ciąg znaków ll lub ciąg znaków LL) (od C ++ 11)
Następujące zmienne są również inicjowane do tej samej wartości:
unsigned long long l1 = 18446744073709550592ull; // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14
Notatki
Litery w literałach liczb całkowitych nie uwzględniają wielkości liter: 0xDeAdBaBeU i 0XdeadBABEu reprezentują ten sam numer (jednym wyjątkiem jest długi i długi przyrostek, którym jest ll lub LL, nigdy lL lub Ll)
Nie ma ujemnych literałów całkowitych. Wyrażenia takie jak -1 stosują jednoargumentowy operator minus do wartości reprezentowanej przez literał, co może obejmować konwersje typu niejawnego.
W C przed C99 (ale nie w C ++), nieszyfrowane wartości dziesiętne, które nie pasują do long int, mogą mieć typ unsigned long int.
W przypadku użycia wyrażenia kontrolnego #if lub #elif wszystkie podpisane stałe całkowite działają tak, jakby miały typ std :: intmax_t, a wszystkie stałe całkowite bez znaku działają tak, jakby miały typ std :: uintmax_t.