CV znamená Constant-Volatile. Deklarace objektu, kterému nepředchází const a / nebo volatile, je typ bez cv. Na druhou stranu je deklarace objektu, kterému předchází const a / nebo volatile, typ kvalifikovaný pro životní prostředí. Pokud je objekt deklarován jako const, hodnotu v jeho umístění nelze změnit. Těkavá proměnná je proměnná, jejíž hodnota je pod vlivem programátora, a proto ji kompilátor nemůže změnit.Specifikátory třídy úložiště odkazují na životnost, místo a způsob, jakým typ existuje. Specifikátory třídy úložiště jsou static, mutable, thread_local a extern.
Tento článek vysvětluje C ++ kvalifikátory a specifikátory tříd úložiště. Proto se hodí některé předběžné znalosti v C ++, které tento článek opravdu ocení.
Obsah článku:
- Kvalifikace
- Specifikátory třídy úložiště
- Závěr
Kvalifikace:
konst
Konstanta deklarovaná jako objekt je objekt, jehož úložiště (umístění) nelze změnit. Například v prohlášení:
int const theInt = 5;Hodnotu 5 v úložišti pro theInt nelze změnit.
nestálý
Zvažte následující prohlášení:
int portVal = 26904873;Překladače někdy zasahují do hodnoty proměnné s nadějí na optimalizaci programu. Kompilátor může udržovat hodnotu proměnné jako konstantní, pokud nemá být konstantní. Hodnoty objektů, které mají co do činění s IO porty mapovanými v paměti nebo s přerušením servisních rutin periferních zařízení, mohou být rušeny kompilátorem. Abyste tomuto rušení zabránili, proveďte proměnnou těkavou, například:
int volatile portVal;portVal = 26904873;
nebo jako:
int volatile portVal = 26904873;
Kombinace konstantní a volatilní:
const a volatile se mohou vyskytnout v jednom příkazu následovně:
int const volatile portVal = 26904873;CV kvalifikace
Proměnná, které předchází const a / nebo volatile, je typ kvalifikovaný pro životní prostředí. Proměnná, před kterou není const, volatile nebo obojí, je typ bez cv.
Objednávání:
Jeden typ může být kvalifikován více než jiný:
- Žádný kvalifikátor cv není menší než kvalifikátor const
- Žádný kvalifikátor cv není také menší než volatilní kvalifikátor
- Žádný kvalifikátor cv není menší než kvalifikátor const-volatile
- kvalifikátor const je menší než kvalifikátor const-volatile
- volatile kvalifikátor je menší než const-volatile kvalifikátor
Dosud nebyl učiněn závěr, zda jsou const a volatile stejné hodnoty.
Pole a instanční objekt:
Když je pole deklarováno konstantní, jako v následujícím prohlášení, znamená to, že hodnotu každého prvku pole nelze změnit:
const char arr [] = 'a', 'b', 'c', 'd';Ať už je to „a“, „b“, „c“ nebo „d“, stále jej nelze změnit na jinou hodnotu (znak).
Podobná situace platí pro instanční objekt třídy. Zvažte následující program:
#zahrnoutpomocí jmenného prostoru std;
třída Cla
veřejnost:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
návrat 0;
Kvůli tvrzení „const Cla obj;“ s const ve funkci main () nelze ani 'a' ani 'b' ani 'c' ani 'd' změnit na jinou hodnotu.
Specifikátory třídy úložiště:
Specifikátory třídy úložiště jsou static, mutable, thread_local a extern.
The statický specifikátor třídy úložiště
Specifikátor třídy statického úložiště umožňuje proměnné žít poté, co její obor prošel, ale nelze k ní přistupovat přímo.
Následující program to ilustruje rekurzivní funkcí:
#zahrnoutpomocí jmenného prostoru std;
int funct ()
statický int stac = 10;
cout << stac < 50)
cout << '\n';
návrat 0;
funct ();
int main ()
funct ();
návrat 0;
Výstupem je:
10 20 30 40 50Pokud statická proměnná není inicializována při své první deklaraci, předpokládá výchozí hodnotu pro svůj typ.
Statický specifikátor lze také použít s členy třídy; použití zde je jiné. Zde umožňuje členovi přístup bez vytváření instance objektu.
Následující program to ilustruje pro datového člena:
#zahrnoutpomocí jmenného prostoru std;
třída Cla
veřejnost:
static const int num = 8;
;
int main ()
cout << Cla::num << '\n';
návrat 0;
Výstupem je:
8Člen statických dat musí být konstantní. Všimněte si, že použití operátoru rozlišení oboru pro přístup ke statické proměnné mimo její rozsah (v hlavní funkci).
Následující program ilustruje použití „statického“ pro členskou funkci:
#zahrnoutpomocí jmenného prostoru std;
třída Cla
veřejnost:
metoda static void ()
cout << "Of static member function!" << '\n';
;
int main ()
Cla :: method ();
návrat 0;
Výstupem je:
Statická členská funkce!
Všimněte si, že použití operátoru rozlišení oboru pro přístup ke statické členské funkci mimo jeho rozsah (v hlavní funkci).
Proměnlivý specifikátor
Pamatujte si shora, že pokud instanční objekt začíná const, nelze hodnotu žádného z jeho běžných datových členů změnit. A aby byl každý takový datový člen změněn, musí být deklarován, proměnlivý.
Ilustruje to následující program:
#zahrnoutpomocí jmenného prostoru std;
třída Cla
veřejnost:
char ch0 = 'a';
char ch1 = 'b';
měnitelný char ch2 = 'c';
char ch3 = 'd';
;
int main ()
const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
návrat 0;
Výstupem je:
'a "b" z "d"Specifikátor thread_local
Při normálním běhu programu se provede jeden segment kódu, poté další segment kódu, za ním následuje další segment kódu atd. To je jedno vlákno; hlavní vlákno. Pokud se dva segmenty kódu provádějí současně (se stejnou dobou trvání), je potřeba druhé vlákno. Výsledek druhého vlákna může být dokonce připraven před hlavním vláknem.
Funkce main () je jako hlavní vlákno. Program může mít více než dvě vlákna pro takové asynchronní chování.
Druhé vlákno potřebuje k fungování obor (obor oboru). To je obvykle poskytováno rozsahem funkce, funkcí. Proměnná ve vnějším oboru, kterou lze vidět v oboru druhého vlákna.
Následující krátký program ilustruje použití specifikátoru thread_local:
#zahrnout#zahrnout
pomocí jmenného prostoru std;
thread_local int inter = 1;
void thread_function ()
inter = inter + 1;
cout << inter << "nd thread\n";
int main ()
vlákno thr (& thread_function); // thr začíná běžet
cout << inter << "st or main thread\n";
thr.připojit(); // hlavní vlákno čeká na vlákno, thr dokončí
návrat 0;
Výstupem je:
1. nebo hlavní vlákno2. vlákno
Proměnná inter předchází thread_local znamená, že inter má v každém vlákně samostatnou instanci. A že může být upraven v různých vláknech, aby měl různé hodnoty. V tomto programu je mu přiřazena hodnota 1 v hlavním vláknu a upravena na hodnotu 2 v druhém vlákně.
Aby vlákno fungovalo, potřebuje speciální objekt. U tohoto programu je knihovna zahrnuta do „#include
Členská funkce join () pro speciální objekt na své pozici zaměstnává, aby hlavní vlákno počkalo na dokončení druhého vlákna, než bude pokračovat v provádění, jinak může funkce main () skončit bez (druhého) vlákna, které má přinesl svůj výsledek.
Externí specifikátor
Jednoduše řečeno, pro deklaraci není alokována paměť pro proměnnou nebo funkci, zatímco pro definici je alokována paměť. Externí vyhrazené slovo umožňuje deklarovat globální proměnnou nebo funkci v jednom souboru, ale definovat je v jiném. Takové soubory se nazývají překladové jednotky pro celou aplikaci C ++.
Zadejte následující program a uložte jej pod názvem souboru mainFile:
#zahrnoutpomocí jmenného prostoru std;
int myInt;
const char ch;
void myFn ();
int main ()
myFn ();
návrat 0;
Proměnná myInt, konstantní proměnná ch a funkce myFn () byly deklarovány, aniž by byly definovány.
Zadejte následující program s definicemi a uložte jej s názvem souboru, otherFile, do stejného adresáře:
#zahrnoutpomocí jmenného prostoru std;
int myInt = 10;
const char ch = 'c';
void myFn ()
cout << "myFn() says " << myInt << " and " << ch <<'\n';
Zkuste zkompilovat aplikaci na terminálu (příkazový řádek systému DOS) pomocí následujícího příkazu a všimněte si, že se nemusí kompilovat:
hlavní soubor g ++.cpp otherFile.cpp -o kompletní.exeNyní před tři deklarace v mainFile vložte slovo „extern“ takto:
extern int myInt;extern const char ch;
extern void myFn ();
Znovu uložte hlavní soubor. Zkompilujte aplikaci pomocí:
hlavní soubor g ++.cpp otherFile.cpp -o kompletní.exe(Takto se v C ++ kompilují samostatné soubory pro stejnou aplikaci)
A mělo by se to sestavit. Nyní spusťte aplikaci a dokončete.exe a výstup by měl být:
myFn () říká 10 a cVšimněte si, že s použitím „extern“ lze konstantní proměnnou deklarovat v jednom souboru, ale definovat v jiném. Při práci s deklarací funkce a definicí v různých souborech je použití extern volitelné.
Kdy použít extern? Použijte jej, pokud nemáte záhlaví s globálními deklaracemi.
„Extern“ se také používá s deklaracemi šablon - viz dále.
Závěr:
Proměnná, které předchází const a / nebo volatile, je typ kvalifikovaný pro životní prostředí. Proměnná, před kterou není const, volatile nebo obojí, je typ bez cv.
Specifikátory třídy úložiště jsou static, mutable, thread_local a extern. Ty ovlivňují délku života (dobu trvání), místo a způsob uplatnění proměnných v aplikaci.