C++ Std::Valinnainen

C Std Valinnainen



'std::valinnainen'-ominaisuus on saatavilla C++17:ssä. 'std::optional' mahdollistaa valinnaisten arvojen tyyppiturvallisen esityksen tai arvon valinnan. Malliluokka nimeltä 'std::optional' sisältää valinnaisen arvon, joka voi sisältää tai ei ehkä sisällä kelvollista arvoa. Se on turvallisempi korvike esittää tyhjiä tai valinnaisia ​​arvoja kuin raakaosoittimet tai muut tekniikat. 'std::valinnainen' minimoi nollaosoittimen viittausvirheiden mahdollisuuden vaatimalla käyttäjää tarkastamaan nimenomaisesti, onko arvo olemassa ennen sen hakemista.

Esimerkki 1:

'Valinnaiset' ja 'iostream'-otsikkotiedostot tuodaan tähän koodiin. Meidän on tuotava nämä otsikkotiedostot, jotta voimme helposti käyttää niissä määritettyjä toimintoja. Tämän jälkeen sisällytämme 'nimiavaruuden std', joten meidän ei tarvitse kirjoittaa sitä funktioilla erikseen, kuten 'std::optional' ja 'std::cout'. Käytämme tässä 'namespace std'. Joten nyt asetamme 'valinnainen' tai 'cout' kirjoittamatta 'std' niiden kanssa.

Sitten kutsumme main():n ja asetamme 'valinnaisen' ja asetamme sen arvoon 'int' ja julistamme 'myNum'. Se on syntaksi 'std::optional'-muuttujan ilmoittamiselle. Sitten alustamme toisen muuttujan nimeltä 'value' ja annamme arvon 'myNum'-muuttujalle käyttämällä value_or()-funktiota. Tässä funktiossa välitetään '99', joten se määrittää tämän '99' 'muNum'-muuttujalle, jos arvoa ei ole, ja tallentaa sen 'arvo'-muuttujaan. Sitten asetamme tämän alle 'cout', joka auttaa näyttämään arvon, jonka määritimme sen yläpuolella olevalle muuttujalle.







Koodi 1:

#include

#include

käyttäen nimiavaruutta std ;

int pää ( ) {

valinnainen < int > myNum ;

int arvo = myNum. arvo_tai ( 99 ) ;

cout << 'myNum:n arvo on:' << arvo << endl ;

palata 0 ;

}

Lähtö:



Tässä voimme huomata, että '99' näytetään, mikä tarkoittaa, että arvoa ei ollut yllä ja lisäämämme arvo on määritetty tälle muuttujalle.







Esimerkki 2:

Sisällytämme ensin otsikkotiedostot ja sijoitamme 'nimiavaruuden std'. Nyt tämän alla julistamme 'std::optional'-funktion, joka on 'divideFunc()'. 'Osinko' ja 'jakaja' ovat tämän funktion kaksi parametria. Käytämme sitten 'jos' sen alle, johon lisäämme ehdon, joka sanoo 'jakaja != 0'. Jos tämä täyttyy, se palauttaa tämän jaon vastauksen, kun lisäämme tähän 'return'. Muussa tapauksessa se palauttaa 'nullopt', mikä tarkoittaa, ettei turvatyypin arvoa ole. Nyt kutsumme main(). Päätelläksemme 'std::valinnainen' sijoitamme 'divideFunc()' ja lisäämme siihen '27, 3' ja kohdistamme tuloksen 'osamäärä'-muuttujaan.

Tässä käytämme 'auto'-avainsanaa, jotta se säätää automaattisesti tietotyyppiään. Tämän jälkeen lisäämme 'jos', jossa hyödynnämme 'has-arvoa', joka määrittää, vastaanotetaanko tyyppiarvo. Sitten sijoitamme 'cout', joka tekee tuloksesta, joka on tallennettu 'osamäärä'-muuttujaan, ja 'else'-osa sisältää lauseen, joka tekee jakajasta nolla.



Koodi 2:

#include

#include

käyttäen nimiavaruutta std ;

valinnainen < int > divideFunc ( int osinkoa , int jakaja ) {

jos ( jakaja != 0 ) {

palata osinkoa / jakaja ;

}

palata nullopt ;

}

int pää ( ) {

auto osamäärä = divideFunc ( 27 , 3 ) ;

jos ( osamäärä. on_arvo ( ) ) {

cout << 'Osamäärä on:' << osamäärä. arvo ( ) << endl ;

} muu {

cout << 'Jakaja on nolla täällä' << endl ;

}

palata 0 ;

}

Lähtö:

Tulos antaa tuloksen jaon jälkeen, mikä tarkoittaa, että jakaja ei ole nolla. Tässä tapauksessa 'std::valinnainen' käytetään määrittämään, onko arvo olemassa vai ei tyyppiturvallisesti.

Esimerkki 3:

Tässä ilmoitamme 'std::optional' -muuttujan, joka on 'numero' main(:n) sisällä. Sitten käytämme 'if', johon asetamme has_value() -funktion tämän 'numero'-muuttujan kanssa. Tämä tarkistaa, onko tässä 'luku'-muuttujassa arvoa vai ei. Jos 'number'-muuttuja sisältää arvon, se tuottaa lauseen, jonka lisäsimme 'if' jälkeen. Muussa tapauksessa se esittää lauseen, jonka sijoitimme sanan 'muu' jälkeen.

Nyt alustamme 'numeron' arvolla '92' ja käytämme 'if'-funktiota uudelleen tämän alapuolella, jossa has_value()-funktio lisätään 'number'-muuttujan kanssa 'jos'-ehtona. Tämä määrittää, onko 'number'-muuttujalla arvoa vai ei. Lause, jonka lisäämme sanan 'if' jälkeen, hahmonnetaan, jos 'number'-muuttujalla on arvo. Jos ei, lause, jonka asetamme sanan 'muu' jälkeen, esitetään.

Koodi 3:

#include

#include

int pää ( ) {

std :: valinnainen < int > määrä ;

jos ( määrä. on_arvo ( ) ) {

std :: cout << 'Numero on läsnä:' << määrä. arvo ( ) << std :: endl ;

} muu {

std :: cout << 'Numero ei ole paikalla.' << std :: endl ;

}

määrä = 92 ;

jos ( määrä. on_arvo ( ) ) {

std :: cout << 'Numero on läsnä:' << määrä. arvo ( ) << std :: endl ;

} muu {

std :: cout << 'Numero ei ole paikalla.' << std :: endl ;

}

palata 0 ;

}

Lähtö:

Tämä tekee 'else'-osan ensin, koska emme anna mitään arvoa 'std::optional'-muuttujalle. Sitten määritämme tälle muuttujalle arvon näyttääksemme sen seuraavalla rivillä.

Esimerkki 4:

Nyt julistamme kolme 'std::valinnaista' muuttujaa, jotka ovat 'n1', 'n2' ja 'n3'. Annamme myös arvot 'n2' ja 'n3' muuttujille, jotka ovat '29' ja '45'. Luokan 'std::optional' muuttuja 'n1' on tyhjä tässä. Nyt käytämme 'boolalphaa', joka auttaa palauttamaan palautuksen 'tosi' tai 'epätosi' muodossa '1' ja '0' sijaan.

Tämän jälkeen hyödynnämme näiden 'std::optional'-muuttujien välisiä relaatiooperaattoreita ja sijoitamme jokaisen lauseen 'cout':n sisään, jotta se hahmontaisi myös lisäämämme vertailun tuloksen. Ensin se tarkistaa, että 'n3 > n2', sitten 'n3 < n2', 'n1 < n2', 'n1 == std::nullopt'. Tässä 'nullopt'-arvoa käytetään no safe -tyypin arvon tai nollan vertailuun. Sitten tarkistamme 'n2 == 49' ja 'n3 == 88' 'cout'-lauseen sisällä erikseen.

Koodi 4:

#include

#include

int pää ( )

{

std :: valinnainen < int > n1 ;

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

std :: valinnainen < int > n3 ( Neljä viisi ) ;

std :: cout << std :: aakkosnumeerinen ;

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 == nolla' << ( n1 == std :: nullopt ) << std :: endl ;

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

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

}

Lähtö:

Aiemmin mainitsemamme C++-ohjelma vertaa erilaisia ​​'std::optional'-tyypin muuttujien arvoja samalla, kun se tulostaa tuloksen tulosteeseen.

Esimerkki 5:

Tähän koodiin sisältyvät otsikkotiedostot ovat 'iostream', 'fstream', 'valinnainen' ja 'string'. 'Fstream' sisältää määritelmän molemmista funktioista, jotka ovat 'ofstream' ja 'ifstream', joita tarvitsemme tässä koodissa. Nyt sisällytämme 'nimiavaruuden std', joten emme sijoita sitä erikseen jokaisen funktion kanssa. Sitten käytämme 'std:optional' ja julistamme funktion nimellä 'ReadFileFunc', jossa välitämme 'const string& f_Name' argumenttina.

Sitten meillä on 'ifstream', joka auttaa lukemaan tiedoston, jonka nimi lisätään 'f_name'-muuttujaan. Sitten käytämme 'if', johon sisällytämme ehdon, joka sanoo, että jos tiedostoa ei avata, se palauttaa 'nullopt', kuten lisäsimme sen 'if'-lauseen alle. Sitten luomme toisen toiminnon, joka on 'fileContent', joka auttaa sisällön kirjoittamisessa tiedostoon, jos tiedosto avataan. Täällä asetamme uudelleen 'return fileContent', joka palauttaa myös sisällön, jonka lisäsimme tiedostoon avaamisen jälkeen.

Nyt kutsumme tässä 'main()':ta, jossa alustamme 'f_Name'-muuttujan 'Sample.txt'-tiedoston nimellä, jonka haluamme avata. Sitten kutsumme tässä 'ReadFileFunc()'-funktiota ja välitämme tässä funktiossa 'f_Name'-muuttujan, joka yrittää lukea tiedoston ja tallentaa sen sisällön 'f_content'-muuttujaan. Tämän alla käytämme 'has_value()' ja 'f_content' muuttuja 'if'. Jos tämä muuttuja sisältää arvon, se myös hahmontaa sen, kun lisäsimme 'cout'-merkin 'if'-kohdan alle, johon sijoitimme myös 'f_content'. Muussa tapauksessa se näyttää virheen, jonka lisäsimme 'muu' jälkeen.

Koodi 5:

#include

#include

#include

#sisällytä

käyttäen nimiavaruutta std ;

valinnainen < merkkijono > ReadFileFunc ( konst merkkijono & f_Nimi ) {

ifstream myFile ( f_Nimi ) ;

jos ( ! myFile. on_open ( ) ) {

palata nullopt ;

}

merkkijono tiedostoContent ( ( isstreambuf_iterator < hiiltyä > ( myFile ) ) , isstreambuf_iterator < hiiltyä > ( ) ) ;

palata tiedostosisältö ;

}

int pää ( ) {

konst merkkijono f_Name = 'Sample.txt' ;

auto f_content = ReadFileFunc ( f_Nimi ) ;

jos ( f_content. on_arvo ( ) ) {

cout << 'Tiedoston sisältö on: \n ' << f_content. arvo ( ) << endl ;

} muu {

cerr << 'Virhe: Tiedostoa ei avattu täällä' << f_Nimi << endl ;

}

palata 0 ;

}

Lähtö:

Täällä se näyttää virheilmoituksen, jonka lisäsimme 'else' -osaan annetun koodin tuloksena.

Johtopäätös

Tässä opetusohjelmassa tutkimme vahvaa C++-ominaisuutta, joka on 'std::valinnainen', ja selitimme, että se tarjoaa standardoidun menetelmän valinnaisten arvojen esittämiseen, poistaen nollaviittauksia koskevan vaatimuksen ja parantaen selkeyttä ja koodin turvallisuutta. Opimme, että se parantaa myös kykyä selittää monimutkaisia ​​asioita ja käsitellä virheitä ystävällisesti.