C ++

C ++ kvalifikācijas un krātuves klases specifikatori

C ++ kvalifikācijas un krātuves klases specifikatori

CV nozīmē Constant-Volatile. Objekta deklarācija, kuras priekšā nav const un / vai volatile, ir cv-unqualified tips. No otras puses, objekta deklarēšana, kuras priekšā ir konst un / vai nepastāvīgs, ir cv kvalificēts tips. Ja objekts tiek deklarēts konst, vērtību tā atrašanās vietā nevar mainīt. Gaistošais mainīgais ir mainīgais, kura vērtība ir programmētāja ietekmē, un tāpēc kompilators to nevar mainīt.Uzglabāšanas klases specifikatori attiecas uz dzīves veidu, vietu un veidu, kādā tips pastāv. Krātuves klases specifikatori ir statiski, maināmi, thread_local un extern.

Šajā rakstā ir izskaidroti C ++ kvalifikatori un krātuves klases specifikatori. Tādējādi dažas sākotnējās zināšanas C ++ valodā ir noderīgas, lai patiešām novērtētu rakstu.

Raksta saturs:

Kvalifikācijas:

konst

Par konstanti deklarēts objekts ir objekts, kura vērtību (vietu) nevar mainīt. Piemēram, paziņojumā:

int const theInt = 5;

InI krātuves vērtību 5 nevar mainīt.

gaistošs

Apsveriet šādu apgalvojumu:

int portVal = 26904873;

Kompilatori dažreiz traucē mainīgā vērtību ar cerību optimizēt programmu. Sastādītājs var saglabāt mainīgā vērtību kā nemainīgu, ja tam nav jābūt nemainīgam. Kompilators var traucēt objektu vērtībām, kas saistītas ar atmiņā kartētiem IO portiem vai perifēro ierīču pakalpojumu pārtraukšanas kārtību. Lai novērstu šādus traucējumus, mainīgo mainiet, piemēram:

int nepastāvīgais portVal;
portVal = 26904873;
vai kā:
int svārstīgais portsVal = 26904873;

Kombinējot konstantu un nepastāvīgo:

konstants un nepastāvīgs vienā paziņojumā var būt šāds:

int const gaistošais portsVal = 26904873;

CV kvalifikācijas

Mainīgais, pirms kura ir norādīts const un / vai volatile, ir CV kvalificēts tips. Mainīgais, pirms kura nav konstanta vai nepastāvīga, vai abi, ir cv-unqualified tips.

Pasūtīšana:

Viens veids var būt vairāk kvalificēts cv nekā cits:

Vēl nav secināts, vai const un volatile ir vienā rangā.

Masīvs un tūlītējs objekts:

Ja masīvs tiek pasludināts par nemainīgu, tāpat kā šajā paziņojumā, tas nozīmē, ka katra masīva elementa vērtību nevar mainīt:

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

Vai tas būtu “a”, “b”, “c” vai “d”, to joprojām nevar mainīt uz kādu citu vērtību (rakstzīmi).

Līdzīga situācija attiecas arī uz klases objektu. Apsveriet šādu programmu:

# iekļaut
izmantojot nosaukumvietu std;
klase Cla

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

const Cla obj;
atgriešanās 0;

Sakarā ar paziņojumu “const Cla obj;” ar konst galveno () funkciju, ne “a”, ne “b”, ne “c”, ne “d” nevar mainīt uz kādu citu vērtību.

Uzglabāšanas klases specifikatori:

Krātuves klases specifikatori ir statiski, maināmi, thread_local un extern.

The statiskā uzglabāšanas klases specifikācija

Statiskās glabāšanas klases specifikators ļauj mainīgajam dzīvot pēc tā darbības jomas iziešanas, taču tam nevar tieši piekļūt.

Turpmākā programma to ilustrē ar rekursīvu funkciju:

# iekļaut
izmantojot nosaukumvietu std;
int funct ()

statiskā int stac = 10;
cout << stac < 50)

cout << '\n';
atgriešanās 0;

funct ();

int main ()

funct ();
atgriešanās 0;

Rezultāts ir:

10 20 30 40 50

Ja statiskais mainīgais netiek inicializēts tā pirmajā deklarācijā, tas uzņem sava veida noklusējuma vērtību.

Statisko specifikatoru var izmantot arī ar klases locekļiem; izmantošana šeit ir atšķirīga. Šeit tas ļauj piekļūt dalībniekam bez objekta eksemplāra.

Datu dalībniekam to ilustrē šī programma:

# iekļaut
izmantojot nosaukumvietu std;
klase Cla

publiski:
statiskā konst int num = 8;
;
int main ()

cout << Cla::num << '\n';
atgriešanās 0;

Rezultāts ir:

8

Statisko datu dalībniekam jābūt nemainīgam. Ņemiet vērā, ka darbības jomas izšķirtspējas operatora izmantošana, lai piekļūtu statiskajam mainīgajam ārpus tā darbības jomas (galvenajā funkcijā).

Šī programma ilustrē “statiskā” izmantošanu dalībnieka funkcijai:

# iekļaut
izmantojot nosaukumvietu std;
klase Cla

publiski:
static void metode ()

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

;
int main ()

Cla :: metode ();
atgriešanās 0;

Rezultāts ir:

Statiskas locekļu funkcijas!

Ņemiet vērā, ka darbības jomas izšķirtspējas operatora izmantošana, lai piekļūtu statiskā locekļa funkcijai ārpus tās darbības jomas (galvenajā funkcijā).

Mainīgais specifikators

Atcerieties no augšas, ka, ja momentizēts objekts sākas ar konst, neviena tā parastā datu dalībnieka vērtību nevar mainīt. Un, lai jebkurš šāds datu dalībnieks tiktu mainīts, tas ir jāpaziņo par mainīgu.

To ilustrē šāda programma:

# iekļaut
izmantojot nosaukumvietu std;
klase Cla

publiski:
char ch0 = 'a';
char ch1 = 'b';
maināmā char ch2 = 'c';
char ch3 = 'd';
;
int main ()

const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
atgriešanās 0;

Rezultāts ir:

"a" b "z" d "

Vītnes_vietas specifikators

Normāli darbojoties programmai, tiek izpildīts viens koda segments, pēc tam nākamais koda segments, kam seko vēl viens koda segments utt. Tas ir viens pavediens; galvenais pavediens. Ja vienlaikus tiek veikti divi koda segmenti (vienāds ilgums), ir nepieciešama otra pavediens. Otrā pavediena rezultāts var būt pat gatavs pirms galvenā pavediena.

Galvenā () funkcija ir kā galvenā vītne. Programmai šādai asinhronai uzvedībai var būt vairāk nekā divi pavedieni.

Lai darbotos, otrajam pavedienam nepieciešama darbības joma (bloka darbības joma). To parasti nodrošina funkcijas darbības joma, funkcija. Mainīgais ārējā tvērumā, ko var redzēt otrā pavediena tvērumā.

Šī īsā programma ilustrē thread_local specifikatora izmantošanu:

# iekļaut
# iekļaut
izmantojot nosaukumvietu std;
thread_local int inter = 1;
void thread_function ()

inter = inter + 1;
cout << inter << "nd thread\n";

int main ()

vītne thr (& pavediena_funkcija); // thr sāk darboties
cout << inter << "st or main thread\n";
thr.pievienoties (); // galvenais pavediens gaida pavedienu, thr pabeigs
atgriešanās 0;

Rezultāts ir:

1. vai galvenais pavediens
2. pavediens

Mainīgais inter, pirms kura ir thread_local, nozīmē, ka inter katrā pavedienā ir atsevišķa instance. Un to var mainīt dažādos pavedienos, lai tam būtu dažādas vērtības. Šajā programmā tam tiek piešķirta vērtība 1 galvenajā pavedienā un modificēta vērtībai 2 otrajā pavedienā.

Vītnei ir nepieciešams īpašs priekšmets, lai tā darbotos. Šai programmai bibliotēka, kas iekļauta “#include ”Ir klase, ko sauc par pavedienu, no kuras objekts thr ir momentāns. Šī objekta konstruktors atsauci uz pavediena funkciju uzskata par argumentu. Vītnes funkcijas nosaukums šajā programmā ir thread_function ().

Īpašā objekta pievienošanās () locekļa funkcija savā izmantotajā pozīcijā liek galvenajam pavedienam gaidīt, kamēr otrais pavediens būs pabeigts, pirms tas turpina izpildīt, pretējā gadījumā galvenā () funkcija var iziet bez (otrā) pavediena. deva savu rezultātu.

Ārējais specifikators

Vienkārši sakot, deklarācijai atmiņa netiek piešķirta mainīgajam vai funkcijai, savukārt definīcijai - atmiņa. Ārējais rezervētais vārds ļauj globālo mainīgo vai funkciju deklarēt vienā failā, bet definēt citā. Šādus failus sauc par tulkošanas vienībām pilnīgai C ++ lietojumprogrammai.

Ierakstiet šo programmu un saglabājiet to ar faila nosaukumu mainFile:

# iekļaut
izmantojot nosaukumvietu std;
int myInt;
const char ch;
anulēt myFn ();
int main ()

myFn ();
atgriešanās 0;

Mainīgais, myInt, konstants mainīgais, ch un funkcija myFn () ir deklarēti bez definīcijas.

Ierakstiet šo programmu ar definīcijām un saglabājiet to ar faila nosaukumu otherFile tajā pašā direktorijā:

# iekļaut
izmantojot nosaukumvietu std;
int myInt = 10;
const char ch = 'c';
anulēt myFn ()

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

Mēģiniet apkopot lietojumprogrammu terminālā (DOS komandu uzvedne), izmantojot šādu komandu, un ievērojiet, ka tā var neapkopot:

g ++ mainfails.cpp otherFile.cpp -o pabeigts.exe

Pirms trim deklarācijām mainFile ar vārdu “extern” sekojiet šādi:

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

Atkārtoti saglabājiet mainFile. Apkopojiet lietojumprogrammu ar:

g ++ mainfails.cpp otherFile.cpp -o pabeigts.exe

(Šādi vienā un tajā pašā lietojumprogrammā atsevišķi faili tiek apkopoti C ++)

Un tam vajadzētu apkopot. Palaidiet lietojumprogrammu un pabeidziet to.exe, un izejai jābūt:

myFn () saka 10 un c

Ņemiet vērā, ka, izmantojot “extern”, nemainīgu mainīgo var deklarēt vienā failā, bet definēt citā. Nodarbojoties ar funkciju deklarēšanu un definīciju dažādos failos, ārējā izmantošana nav obligāta.

Kad lietot extern? Izmantojiet to, ja jums nav galvenes failu ar globālām deklarācijām.

“Extern” tiek izmantots arī ar veidņu deklarācijām - skatīt vēlāk.

Secinājums:

Mainīgais, pirms kura ir norādīts const un / vai volatile, ir CV kvalificēts tips. Mainīgais, pirms kura nav norādīts konst vai nepastāvīgs, vai abi, ir cv-unqualified tips.

Krātuves klases specifikatori ir statiski, maināmi, thread_local un extern. Tie ietekmē mainīgo lielumu dzīves ilgumu (ilgumu), vietu un nodarbināšanas veidu lietojumprogrammā.

Kā salabot sudo add-apt-repository komandu Linux Ubuntu nav atrasta kļūda
Programmatūras lietojumprogrammas var instalēt Ubuntu un Debian sistēmās daudzos veidos. Vienīgais izplatītais programmu instalēšanas veids ir Persona...
Kā lejupielādēt failus no komandrindas, izmantojot komandu Wget?
Wget ir komandrindas lietderība, ko izmanto, lai lejupielādētu failus un tīmekļa lapas no tīmekļa. Lai piekļūtu failiem un tos izgūtu, var izmantot da...
Iespējot atspējot bez uzraudzības jauninājumus Ubuntu
Atjaunināšanas pakotnes ir būtiskas, lai sistēma aizsargātu datus, jo šīm pakotnēm ir īpaši drošības ielāpi. Tomēr Ubuntu funkcija ar nosaukumu Unatte...