C ++

C ++ kvalifikátory a specifikátory tříd úložiště

C ++ kvalifikátory a specifikátory tříd úložiště

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:

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ý:

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:

#zahrnout
pomocí 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í:

#zahrnout
pomocí 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 50

Pokud 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:

#zahrnout
pomocí 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:

#zahrnout
pomocí 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:

#zahrnout
pomocí 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ákno
2. 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 „Má třídu nazvanou vlákno, ze které byl vytvořen instanci objektu thr. Konstruktor pro tento objekt přebírá jako argument odkaz na funkci vlákna. Název funkce podprocesu v tomto programu je thread_function ().

Č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:

#zahrnout
pomocí 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:

#zahrnout
pomocí 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í.exe

Nyní 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 c

Vš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.

Hry Nejlepší hry pro ruční sledování
Nejlepší hry pro ruční sledování
Oculus Quest nedávno představil skvělou myšlenku ručního sledování bez ovladačů. S neustále se zvyšujícím počtem her a aktivit, které provádějí podpor...
Hry Jak zobrazit překrytí OSD v linuxových aplikacích a hrách na celou obrazovku
Jak zobrazit překrytí OSD v linuxových aplikacích a hrách na celou obrazovku
Hraní her na celou obrazovku nebo používání aplikací v režimu celé obrazovky bez rozptýlení vás mohou odříznout od příslušných systémových informací v...
Hry Top 5 karet pro zachycení hry
Top 5 karet pro zachycení hry
Všichni jsme viděli a milovali streamování her na YouTube. PewDiePie, Jakesepticye a Markiplier jsou jen někteří z nejlepších hráčů, kteří vydělali mi...