C ++

Kvalifikátory C ++ a špecifikátory tried úložných zariadení

Kvalifikátory C ++ a špecifikátory tried úložných zariadení

CV znamená Constant-Volatile. Deklarácia objektu, ktorému nepredchádza const a / alebo volatile, je typ bez CV. Na druhej strane, deklarácia objektu, pred ktorou je const a / alebo volatile, je typ kvalifikovaný pre CV. Ak je objekt deklarovaný ako konštantný, hodnotu v jeho umiestnení nie je možné zmeniť. Prchavá premenná je premenná, ktorej hodnota je pod vplyvom programátora, a preto ju kompilátor nemôže zmeniť.Špecifikátory triedy úložiska odkazujú na životnosť, miesto a spôsob, akým daný typ existuje. Špecifikátory triedy úložiska sú statické, premenlivé, thread_local a extern.

Tento článok vysvetľuje kvalifikátory C ++ a špecifikátory tried úložných zariadení. Teda niektoré predbežné znalosti v jazyku C ++ sa hodia na to, aby ste článok skutočne ocenili.

Obsah článku:

Kvalifikácie:

konšt

Objektom deklarovaná konštanta je objekt, ktorého úložisko (umiestnenie) nemožno zmeniť. Napríklad vo vyhlásení:

int const theInt = 5;

Hodnota 5 v úložisku pre theInt sa nedá zmeniť.

prchavý

Zvážte nasledujúce vyhlásenie:

int portVal = 26904873;

Kompilátory niekedy zasahujú do hodnoty premennej s nádejou na optimalizáciu programu. Kompilátor môže udržiavať hodnotu premennej ako konštantnú, ak nemá byť konštantná. Hodnoty objektov, ktoré súvisia s IO portami mapovanými do pamäte alebo s prerušením servisných rutín periférnych zariadení, môžu byť kompilátorom narušené. Ak chcete zabrániť takémuto rušeniu, premennú prchajte, napríklad:

int volatile portVal;
portVal = 26904873;
alebo ako:
int volatilný portVal = 26904873;

Kombinácia konštantnej a volatilnej:

const a volatilita sa môžu vyskytnúť v jednom výkaze takto:

int const volatile portVal = 26904873;

cv-kvalifikanti

Premenná, ktorej predchádza const a / alebo volatile, je typ vhodný pre cv. Premenná, pred ktorou nie je const, ani volatile, ani oboje, je typ bez CV.

Objednávka:

Jeden typ môže byť viac kvalifikovaný pre životné prostredie ako iný:

Zatiaľ sa nedospelo k záveru, či sú konštanty a volatilita rovnakého stupňa.

Pole a inštančný objekt:

Keď je pole vyhlásené za konštantné, ako v nasledujúcom vyhlásení, znamená to, že hodnotu každého prvku poľa nemožno zmeniť:

const char arr [] = 'a', 'b', 'c', 'd';

Či už je to „a“, „b“, „c“ alebo „d“, stále sa nedá zmeniť na inú hodnotu (znak).

Podobná situácia platí pre inštančný objekt triedy. Zvážte nasledujúci program:

#include
pomocou namespace std;
trieda Cla

verejné:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()

const Cla obj;
návrat 0;

Z dôvodu vyjadrenia „const Cla obj;“ s konštantou vo funkcii main () nemožno zmeniť ani „a“, ani „b“, ani „c“ ani „d“ na inú hodnotu.

Špecifikátory triedy úložiska:

Špecifikátory triedy úložiska sú statické, premenlivé, thread_local a extern.

The statický špecifikátor triedy úložiska

Špecifikátor triedy statického úložiska umožňuje premennej žiť, až prejde jej rozsah, ale nemožno k nej získať priamy prístup.

Nasledujúci program to ilustruje s rekurzívnou funkciou:

#include
pomocou namespace std;
int funct ()

statický int stac = 10;
cout << stac < 50)

cout << '\n';
návrat 0;

funct ();

int main ()

funct ();
návrat 0;

Výstup je:

10 20 30 40 50

Ak statická premenná nie je inicializovaná pri svojej prvej deklarácii, predpokladá sa predvolená hodnota pre jej typ.

Statický špecifikátor možno použiť aj s členmi triedy; použitie je tu rôzne. Tu umožňuje členovi prístup bez inštancie objektu.

Nasledujúci program to ilustruje pre dátového člena:

#include
pomocou namespace std;
trieda Cla

verejné:
static const int num = 8;
;
int main ()

cout << Cla::num << '\n';
návrat 0;

Výstup je:

8

Člen statických údajov musí byť konštantný. Upozorňujeme, že použitie operátora rozlíšenia rozsahu na prístup k statickej premennej mimo jej rozsahu (v hlavnej funkcii).

Nasledujúci program ilustruje použitie „statického“ pre členskú funkciu:

#include
pomocou namespace std;
trieda Cla

verejné:
metóda statickej neplatnosti ()

cout << "Of static member function!" << '\n';

;
int main ()

Cla :: method ();
návrat 0;

Výstup je:

Statickej členskej funkcie!

Upozorňujeme, že použitie operátora rozlíšenia rozsahu na prístup k statickej členskej funkcii mimo jej rozsahu (v hlavnej funkcii).

Premenlivý špecifikátor

Pamätajte si zhora, že ak inštančný objekt začína konštantou, hodnotu ktoréhokoľvek z jeho bežných dátových členov nie je možné zmeniť. A aby sa mohol každý takýto údajový člen zmeniť, musí byť deklarovaný ako premenlivý.

Nasledujúci program to ilustruje:

#include
pomocou namespace std;
trieda Cla

verejné:
char ch0 = 'a';
char ch1 = 'b';
premenlivý znak 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ýstup je:

„a„ b “z„ d “

Špecifikátor vlákna_lokálneho

Pri normálnom chode programu sa vykoná jeden segment kódu, potom nasledujúci segment kódu, za ktorým nasleduje ďalší segment kódu atď. To je jedno vlákno; hlavné vlákno. Ak sa dva segmenty kódu vykonávajú súčasne (s rovnakou dobou trvania), potom je potrebné druhé vlákno. Výsledok druhého vlákna môže byť dokonca pripravený pred hlavným vláknom.

Funkcia main () je ako hlavné vlákno. Program môže mať viac ako dve vlákna pre také asynchrónne správanie.

Druhé vlákno potrebuje na svoju činnosť rozsah (rozsah bloku). Toto je zvyčajne poskytované funkčným rozsahom, funkciou. Premenná vo vonkajšom rozsahu, ktorú je možné vidieť v rozsahu druhého vlákna.

Nasledujúci krátky program ilustruje použitie špecifikátora thread_local:

#include
#include
pomocou namespace 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 sa rozbehne
cout << inter << "st or main thread\n";
thr.spojiť sa (); // hlavné vlákno čaká na vlákno, thr dokončí
návrat 0;

Výstup je:

1. alebo hlavný závit
2. vlákno

Premenná inter, pred ktorou je vlákno_local, znamená, že inter má v každom vlákne samostatnú inštanciu. A že sa dá upraviť v rôznych vláknach tak, aby mali rôzne hodnoty. V tomto programe je mu priradená hodnota 1 v hlavnom vlákne a upravená na hodnotu 2 v druhom vlákne.

Vlákno potrebuje na svoju činnosť špeciálny objekt. Pre tento program je knižnica zahrnutá do „#include ”Má triedu nazývanú vlákno, z ktorej bol inštanovaný objekt thr. Konštruktor tohto objektu berie odkaz na funkciu vlákna ako argument. Názov funkcie vlákna v tomto programe je thread_function ().

Členská funkcia join () pre špeciálny objekt na svojej použitej pozícii spôsobí, že hlavné vlákno počká na ukončenie vykonávania druhého vlákna skôr, ako bude pokračovať v vykonávaní, inak môže funkcia main () skončiť bez (druhého) vlákna, ktoré má priniesol svoj výsledok.

Externý špecifikátor

Zjednodušene povedané, pre deklaráciu nie je alokovaná pamäť pre premennú alebo funkciu, zatiaľ čo pre definíciu je alokovaná pamäť. Externé vyhradené slovo umožňuje deklarovať globálnu premennú alebo funkciu v jednom súbore, ale definovať ich v inom. Takéto súbory sa nazývajú prekladové jednotky pre celú aplikáciu C ++.

Zadajte nasledujúci program a uložte ho s názvom súboru mainFile:

#include
pomocou namespace std;
int myInt;
const char ch;
void myFn ();
int main ()

myFn ();
návrat 0;

Premenná myInt, konštantná premenná ch a funkcia myFn () boli deklarované bez toho, aby boli definované.

Zadajte nasledujúci program s definíciami a uložte ich s názvom súboru, otherFile, do toho istého adresára:

#include
pomocou namespace std;
int myInt = 10;
const char ch = 'c';
void myFn ()

cout << "myFn() says " << myInt << " and " << ch <<'\n';

Pokúste sa skompilovať aplikáciu na termináli (príkazový riadok DOS) pomocou nasledujúceho príkazu a všimnite si, že sa nemusí kompilovať:

hlavný súbor g ++.cpp otherFile.cpp -o kompletné.exe

Teraz pred troma vyhláseniami v hlavnom súbore zadajte slovo „extern“ takto:

extern int myInt;
extern const char ch;
externus void myFn ();

Znova uložte hlavný súbor. Zostavte aplikáciu s:

hlavný súbor g ++.cpp otherFile.cpp -o kompletné.exe

(Takto sa v C ++ kompilujú samostatné súbory pre rovnakú aplikáciu.)

A malo by sa to zostaviť. Teraz spustite aplikáciu a dokončite ju.exe a výstup by mal byť:

myFn () hovorí 10 a c

Upozorňujeme, že pri použití výrazu „extern“ možno v jednom súbore deklarovať konštantnú premennú, ale v inom ju definovať. Pri práci s deklaráciou a definíciou funkcie v rôznych súboroch je použitie extern voliteľné.

Kedy použiť externé? Použite ho, ak nemáte hlavičkové súbory s globálnymi vyhláseniami.

Výraz „extern“ sa používa aj pri deklaráciách šablón - pozri ďalej.

Záver:

Premenná, ktorej predchádza const a / alebo volatile, je typ vhodný pre cv. Premenná, pred ktorou nie je const, ani volatile, ani oboje, je typ bez CV.

Špecifikátory triedy úložiska sú statické, premenlivé, thread_local a extern. Tieto ovplyvňujú životnosť (trvanie), miesto a spôsob zamestnania premenných v aplikácii.

WinMouse vám umožňuje prispôsobiť a vylepšiť pohyb ukazovateľa myši na počítači so systémom Windows
Ak chcete vylepšiť predvolené funkcie kurzora myši, použite freeware WinMouse. Pridáva ďalšie funkcie, ktoré vám pomôžu vyťažiť zo svojej skromnej myš...
Tlačidlo ľavého kliknutia myši nefunguje v systéme Windows 10
Ak používate samostatnú myš s prenosným počítačom alebo stolovým počítačom, ale nefunguje ľavé tlačidlo myši vo Windows 10/8/7 z nejakého dôvodu uvádz...
Kurzor pri písaní v systéme Windows 10 skáče alebo sa pohybuje náhodne
Ak zistíte, že kurzor myši skáče alebo sa pohybuje sám, automaticky a náhodne pri písaní na notebooku alebo počítači so systémom Windows, niektoré z t...