C++ Std::Opcionalno

C Std Opcionalno



Značajka “std::optional” dostupna je u C++17. 'std::optional' dopušta tipski siguran prikaz opcijskih vrijednosti ili izbor posjedovanja vrijednosti. Klasa predloška pod nazivom 'std::optional' sadrži neobaveznu vrijednost koja može, ali ne mora sadržavati valjanu vrijednost. To je sigurnija zamjena za predstavljanje praznih ili neobaveznih vrijednosti od neobrađenih pokazivača ili drugih tehnika. 'std::optional' minimizira mogućnost pogrešaka dereferenciranja nultog pokazivača zahtijevajući od korisnika da izričito provjeri postoji li vrijednost prije njezina dohvaćanja.

Primjer 1:

Datoteke zaglavlja 'optional' i 'iostream' uvezene su u ovaj kod. Moramo uvesti ove datoteke zaglavlja kako bismo mogli lako pristupiti funkcijama koje su u njima definirane. Nakon ovoga uključujemo 'namespace std' tako da ga ne moramo zasebno upisivati ​​s funkcijama poput 'std::optional' i 'std::cout'. Ovdje koristimo 'namespace std'. Dakle, sada postavljamo 'optional' ili 'cout' bez upisivanja 'std' s njima.

Zatim pozivamo main() i stavljamo 'optional' i postavljamo ga na 'int' i deklariramo 'myNum'. To je sintaksa za deklariranje varijable “std::optional”. Zatim inicijaliziramo drugu varijablu pod nazivom 'value' i dodjeljujemo vrijednost varijabli 'myNum' korištenjem funkcije value_or(). U ovoj funkciji prosljeđujemo “99”, tako da ona dodjeljuje ovo “99” varijabli “muNum” ako nema prisutne vrijednosti i pohranjuje je u varijabli “value”. Zatim ispod ovoga stavljamo 'cout' što pomaže u prikazivanju vrijednosti koju smo dodijelili varijabli iznad njega.







Kod 1:

#include

#include

koristeći prostor imena std ;

int glavni ( ) {

neobavezan < int > mojBroj ;

int vrijednost = mojBroj. vrijednost_ili ( 99 ) ;

cout << 'Vrijednost myNum je: ' << vrijednost << endl ;

povratak 0 ;

}

Izlaz:



Ovdje možemo primijetiti da je prikazano '99' što znači da vrijednost nije bila prisutna iznad i vrijednost koju smo dodali je dodijeljena toj varijabli.







Primjer 2:

Prvo uključujemo datoteke zaglavlja i postavljamo 'namespace std'. Sada, ispod ovoga, deklariramo funkciju “std::optional” koja je “divideFunc()”. 'Dividenda' i 'djelitelj' su dva parametra ove funkcije. Zatim koristimo 'if' ispod toga gdje dodajemo uvjet koji kaže 'divisior != 0'. Ako je ovo zadovoljeno, vraća se odgovor ovog dijeljenja dok unutar ovoga dodajemo 'povratak'. Inače, vraća 'nullopt' što znači da nema vrijednosti sigurnog tipa. Sada pozivamo main(). Da bismo zaključili o 'std::optional', postavljamo 'divideFunc()' i dodajemo '27, 3' u njega i dodjeljujemo rezultat varijabli 'kvocijent'.

Ovdje koristimo ključnu riječ 'auto' tako da automatski prilagođava svoju vrstu podataka. Nakon toga dodajemo 'if' gdje koristimo 'has-vrijednost' koja određuje je li tip-vrijednost primljen. Zatim postavljamo 'cout' koji prikazuje ishod koji je pohranjen u varijabli 'kvocijent', a dio 'else' sadrži izjavu koja prikazuje da je djelitelj nula.



Kod 2:

#include

#include

koristeći prostor imena std ;

neobavezan < int > podijelitiFunc ( int dividenda , int šestar ) {

ako ( šestar != 0 ) {

povratak dividenda / šestar ;

}

povratak nullopt ;

}

int glavni ( ) {

auto kvocijent = podijelitiFunc ( 27 , 3 ) ;

ako ( kvocijent. ima_vrijednost ( ) ) {

cout << 'Kvocijent je: ' << kvocijent. vrijednost ( ) << endl ;

} drugo {

cout << 'Ovdje je djelitelj nula' << endl ;

}

povratak 0 ;

}

Izlaz:

Izlaz daje rezultat nakon dijeljenja što znači da djelitelj nije nula. U ovom slučaju, 'std::optional' koristi se za određivanje postoji li vrijednost ili ne na siguran način.

Primjer 3:

Ovdje deklariramo varijablu “std::optional” koja je “broj” unutar main(). Zatim koristimo 'if' u koji postavljamo funkciju has_value() s ovom varijablom 'broj'. Ovo provjerava postoji li vrijednost ili ne u ovoj varijabli 'broj'. Ako varijabla 'number' sadrži vrijednost, ona prikazuje izjavu koju smo dodali nakon 'if'. U suprotnom, prikazuje iskaz koji smo stavili iza 'else'.

Sada inicijaliziramo 'broj' s '92' i ponovno koristimo 'if' ispod ovoga gdje je dodana funkcija has_value() s varijablom 'number' u 'if' kao uvjetu. Ovo određuje ima li varijabla 'broj' vrijednost ili ne. Rečenica koju dodajemo nakon 'if' prikazuje se ako varijabla 'number' ima vrijednost. Ako nije, iskaz koji postavljamo iza 'else' se prikazuje.

Kod 3:

#include

#include

int glavni ( ) {

std :: neobavezan < int > broj ;

ako ( broj. ima_vrijednost ( ) ) {

std :: cout << 'Broj je prisutan: ' << broj. vrijednost ( ) << std :: endl ;

} drugo {

std :: cout << 'Broj nije prisutan.' << std :: endl ;

}

broj = 92 ;

ako ( broj. ima_vrijednost ( ) ) {

std :: cout << 'Broj je prisutan: ' << broj. vrijednost ( ) << std :: endl ;

} drugo {

std :: cout << 'Broj nije prisutan.' << std :: endl ;

}

povratak 0 ;

}

Izlaz:

Ovo prvo prikazuje dio 'else' jer ne dodjeljujemo nikakvu vrijednost varijabli 'std::optional'. Zatim dodijelimo vrijednost ovoj varijabli kako bismo tu vrijednost prikazali u sljedećem retku.

Primjer 4:

Sada deklariramo tri “std::optional” varijable koje su “n1”, “n2” i “n3”. Također dodjeljujemo vrijednosti varijablama “n2” i “n3” koje su “29” odnosno “45”. Varijabla “n1” klase “std::optional” ovdje je prazna. Sada koristimo 'boolalpha' koji pomaže u vraćanju povrata u obliku 'true' ili 'false' umjesto '1' i '0'.

Nakon toga koristimo relacijske operatore između ovih varijabli 'std::optional' i svaku naredbu postavljamo unutar 'cout' kako bi također prikazao rezultat usporedbe koju smo dodali. Prvo provjerava je li “n3 > n2”, zatim “n3 < n2”, “n1 < n2”, “n1 == std::nullopt”. Ovdje se 'nullopt' koristi za usporedbu vrijednosti bez sigurnog tipa ili null. Zatim zasebno provjeravamo “n2 == 49” i “n3 == 88” unutar izjave “cout”.

Kod 4:

#include

#include

int glavni ( )

{

std :: neobavezan < int > n1 ;

std :: neobavezan < int > n2 ( 29 ) ;

std :: neobavezan < int > n3 ( Četiri pet ) ;

std :: cout << std :: alfanumerički ;

std :: cout << 'N3 > n2' << ( n3 > n2 ) << std :: endl ;

std :: cout << 'N3 < n2' << ( n3 < n2 ) << std :: endl ;

std :: cout << 'N1 < n2' << ( n1 < n2 ) << std :: endl ;

std :: cout << 'N1 == nula' << ( n1 == std :: nullopt ) << std :: endl ;

std :: cout << 'N2 == 49' << ( n2 == 29 ) << std :: endl ;

std :: cout << 'N3 == 88' << ( n3 == 88 ) << std :: endl ;

}

Izlaz:

C++ program koji smo prethodno spomenuli uspoređuje različite vrijednosti varijabli tipa 'std::optional' dok istovremeno ispisuje ishod na izlaz.

Primjer 5:

Datoteke zaglavlja koje su uključene u ovaj kod su 'iostream', 'fstream', 'optional' i 'string'. 'Fstream' sadrži definiciju obje funkcije koje su 'ofstream' i 'ifstream' koje su nam potrebne u ovom kodu. Sada uključujemo 'namespace std', tako da ga ne stavljamo zasebno uz svaku funkciju. Zatim koristimo “std:optional” i deklariramo funkciju s nazivom “ReadFileFunc” u kojoj prosljeđujemo “const string& f_Name” kao argument.

Zatim, imamo “ifstream” koji pomaže čitati datoteku čiji će naziv biti dodan u varijablu “f_name”. Zatim koristimo 'if' u koji uključujemo uvjet koji kaže da ako datoteka nije otvorena, vraća 'nullopt' jer smo ga dodali ispod izjave 'if'. Zatim stvaramo drugu funkciju koja je 'fileContent' koja pomaže u pisanju sadržaja u datoteku ako se datoteka otvori. Ovdje ponovno postavljamo “return fileContent” koji također vraća sadržaj koji smo dodali u datoteku nakon otvaranja.

Sada ovdje pozivamo “main()” u kojem inicijaliziramo varijablu “f_Name” s nazivom datoteke “Sample.txt” koju želimo otvoriti. Zatim ovdje pozivamo 'ReadFileFunc()' i prosljeđujemo varijablu 'f_Name' u ovu funkciju koja pokušava pročitati datoteku i pohranjuje njezin sadržaj u varijablu 'f_content'. Ispod toga koristimo “has_value()” s varijablom “f_content” u “if”. Ako ova varijabla sadrži vrijednost, ona je također prikazuje jer smo dodali 'cout' ispod 'if' u koji smo također stavili 'f_content'. U suprotnom, prikazuje pogrešku koju smo dodali iza 'else'.

Kod 5:

#include

#include

#include

#include

koristeći prostor imena std ;

neobavezan < niz > ReadFileFunc ( konst niz i f_Ime ) {

ifstream myFile ( f_Ime ) ;

ako ( ! mojaDatoteka. otvoreno je ( ) ) {

povratak nullopt ;

}

string fileContent ( ( isstreambuf_iterator < char > ( mojaDatoteka ) ) , isstreambuf_iterator < char > ( ) ) ;

povratak fileContent ;

}

int glavni ( ) {

konst string f_Name = 'Uzorak.txt' ;

auto f_sadržaj = ReadFileFunc ( f_Ime ) ;

ako ( f_sadržaj. ima_vrijednost ( ) ) {

cout << 'Sadržaj datoteke je: \n ' << f_sadržaj. vrijednost ( ) << endl ;

} drugo {

cerr << 'Pogreška: datoteka nije otvorena ovdje' << f_Ime << endl ;

}

povratak 0 ;

}

Izlaz:

Ovdje se prikazuje izjava o pogrešci koju smo dodali u dio 'else' kao rezultat zadanog koda.

Zaključak

U ovom vodiču istražili smo snažnu značajku C++ koja je 'std::optional' i objasnili da nudi standardiziranu metodu predstavljanja opcijskih vrijednosti, uklanjajući zahtjev za nultim referencama i poboljšavajući jasnoću i sigurnost koda. Saznali smo da također poboljšava sposobnost objašnjavanja kompliciranih problema i elegantnog rješavanja pogrešaka.