C++ Std::Opcjonalne

C Std Opcjonalne



Funkcja „std::opcjonalna” jest dostępna w C++ 17. „std::opcjonalne” umożliwia bezpieczną reprezentację wartości opcjonalnych lub wybór posiadania wartości. Klasa szablonu o nazwie „std::opcjonalna” zawiera opcjonalną wartość, która może zawierać prawidłową wartość lub nie. Jest to bezpieczniejszy substytut reprezentowania pustych lub opcjonalnych wartości niż surowe wskaźniki lub inne techniki. Opcja „std::opcjonalna” minimalizuje możliwość wystąpienia błędów dereferencji wskaźnika zerowego, wymagając od użytkownika jawnego sprawdzenia, czy wartość istnieje przed jej pobraniem.

Przykład 1:

W tym kodzie importowane są pliki nagłówkowe „opcjonalne” i „iostream”. Musimy zaimportować te pliki nagłówkowe, abyśmy mogli łatwo uzyskać dostęp do zdefiniowanych w nich funkcji. Następnie dołączamy „przestrzeń nazw std”, więc nie musimy wpisywać jej oddzielnie za pomocą funkcji, takich jak „std::opcjonalne” i „std::cout”. Używamy tutaj „przestrzeni nazw std”. Zatem teraz umieszczamy „opcjonalne” lub „cout” bez wpisywania razem z nimi „std”.

Następnie wywołujemy funkcję main(), umieszczamy „opcjonalne”, ustawiamy na „int” i deklarujemy „myNum”. Jest to składnia deklarowania zmiennej „std::opcjonalna”. Następnie inicjujemy kolejną zmienną o nazwie „wartość” i przypisujemy wartość do zmiennej „myNum” za pomocą funkcji value_or(). W tej funkcji przekazujemy „99”, więc przypisuje ona „99” do zmiennej „muNum”, jeśli nie ma wartości, i przechowuje ją w zmiennej „wartość”. Następnie umieszczamy pod tym „cout”, co pomaga wyświetlić wartość, którą przypisaliśmy zmiennej powyżej.







Kod 1:

#include

#include

używając przestrzeni nazw std ;

wew główny ( ) {

opcjonalny < wew > mójNum ;

wew wartość = mójNum. wartość_lub ( 99 ) ;

cout << „Wartość myNum to: „ << wartość << koniec ;

powrót 0 ;

}

Wyjście:



Tutaj możemy zauważyć, że wyświetla się liczba „99”, co oznacza, że ​​wartości nie było powyżej i wartość, którą dodaliśmy, jest przypisana do tej zmiennej.







Przykład 2:

Najpierw dołączamy pliki nagłówkowe i umieszczamy „przestrzeń nazw std”. Teraz poniżej deklarujemy funkcję „std::opcjonalna”, która jest funkcją „divideFunc()”. „Dywidenda” i „dzielnik” to dwa parametry tej funkcji. Następnie używamy „if” poniżej, dodając warunek mówiący „dzielnik ! = 0”. Jeśli to jest spełnione, zwraca odpowiedź tego dzielenia, gdy dodamy do tego słowo „return”. W przeciwnym razie zwraca „nullopt”, co oznacza brak wartości typu bezpiecznego. Teraz wywołujemy funkcję main(). Aby wywnioskować o „std::opcjonalny”, umieszczamy „divideFunc()”, dodajemy „27, 3” i przypisujemy wynik do zmiennej „iloraz”.

W tym przypadku używamy słowa kluczowego „auto”, które automatycznie dostosowuje typ danych. Następnie dodajemy „if”, w którym wykorzystujemy „wartość ma”, która określa, czy otrzymana zostanie wartość typu. Następnie umieszczamy „cout”, który wyświetla wynik przechowywany w zmiennej „iloraz”, a część „else” zawiera stwierdzenie, które pokazuje, że dzielnik wynosi zero.



Kod 2:

#include

#include

używając przestrzeni nazw std ;

opcjonalny < wew > podzielFun ( wew dywidenda , wew rozdzielacz ) {

Jeśli ( rozdzielacz != 0 ) {

powrót dywidenda / rozdzielacz ;

}

powrót nullopt ;

}

wew główny ( ) {

automatyczny iloraz = podzielFun ( 27 , 3 ) ;

Jeśli ( iloraz. ma_wartość ( ) ) {

cout << „Iloraz wynosi:” << iloraz. wartość ( ) << koniec ;

} w przeciwnym razie {

cout << „Dzielnik wynosi tutaj zero” << koniec ;

}

powrót 0 ;

}

Wyjście:

Dane wyjściowe wyświetlają wynik po dzieleniu, co oznacza, że ​​dzielnik nie wynosi zero. W tym przypadku „std::opcjonalny” służy do określenia, czy wartość istnieje, czy nie jest bezpieczna dla typu.

Przykład 3:

Tutaj deklarujemy zmienną „std::opcjonalną”, która jest „liczbą” wewnątrz funkcji main(). Następnie używamy „if”, w którym umieszczamy funkcję has_value() z tą zmienną „liczbową”. Sprawdza to, czy w tej zmiennej „liczbowej” znajduje się wartość, czy nie. Jeśli zmienna „number” zawiera wartość, renderuje instrukcję, którą dodaliśmy po „if”. W przeciwnym razie renderuje instrukcję, którą umieściliśmy po „else”.

Teraz inicjujemy „liczbę” wartością „92” i ponownie wykorzystujemy „if” poniżej, gdzie dodawana jest funkcja has_value() ze zmienną „liczba” w „jeśli” jako warunek. Określa to, czy zmienna „liczba” ma wartość. Zdanie, które dodajemy po „if” jest renderowane, jeśli zmienna „liczba” ma wartość. Jeśli nie, renderowane jest stwierdzenie, które umieszczamy po „else”.

Kod 3:

#include

#include

wew główny ( ) {

st :: opcjonalny < wew > numer ;

Jeśli ( numer. ma_wartość ( ) ) {

st :: cout << „Numer jest obecny: „ << numer. wartość ( ) << st :: koniec ;

} w przeciwnym razie {

st :: cout << „Numer nie istnieje.” << st :: koniec ;

}

numer = 92 ;

Jeśli ( numer. ma_wartość ( ) ) {

st :: cout << „Numer jest obecny: „ << numer. wartość ( ) << st :: koniec ;

} w przeciwnym razie {

st :: cout << „Numer nie istnieje”. << st :: koniec ;

}

powrót 0 ;

}

Wyjście:

To renderuje część „else” jako pierwszą, ponieważ nie przypisujemy żadnej wartości do zmiennej „std::opcjonalna”. Następnie przypisujemy wartość tej zmiennej, aby wyświetlić tę wartość w następnym wierszu.

Przykład 4:

Teraz deklarujemy trzy zmienne „std::opcjonalne”, którymi są „n1”, „n2” i „n3”. Przypisujemy także wartości zmiennym „n2” i „n3”, czyli odpowiednio „29” i „45”. Zmienna „n1” klasy „std::opcjonalny” jest tutaj pusta. Teraz używamy „boolalpha”, która pomaga w zwróceniu zwrotu w formie „prawda” lub „fałsz” zamiast „1” i „0”.

Następnie używamy operatorów relacyjnych pomiędzy zmiennymi „std::opcjonalny” i umieszczamy każdą instrukcję wewnątrz „cout”, tak aby wyświetlała również wynik dodanego przez nas porównania. Najpierw sprawdza, czy „n3 > n2”, następnie „n3 < n2”, „n1 < n2”, „n1 == std::nullopt ”. W tym przypadku „nullopt” służy do porównywania wartości typu no-safe lub null. Następnie osobno sprawdzamy „n2 == 49” i „n3 == 88” wewnątrz instrukcji „cout”.

Kod 4:

#include

#include

wew główny ( )

{

st :: opcjonalny < wew > n1 ;

st :: opcjonalny < wew > n2 ( 29 ) ;

st :: opcjonalny < wew > n3 ( Cztery pięć ) ;

st :: cout << st :: alfanumeryczne ;

st :: cout << „N3 > n2” << ( n3 > n2 ) << st :: koniec ;

st :: cout << „N3 << ( n3 < n2 ) << st :: koniec ;

st :: cout << „N1 < n2” << ( n1 < n2 ) << st :: koniec ;

st :: cout << „N1 == null” << ( n1 == st :: nullopt ) << st :: koniec ;

st :: cout << „N2 == 49” << ( n2 == 29 ) << st :: koniec ;

st :: cout << „N3 == 88” << ( n3 == 88 ) << st :: koniec ;

}

Wyjście:

Program w C++, o którym wspominaliśmy wcześniej, porównuje różne wartości zmiennych typu „std::opcjonalny”, jednocześnie wypisując wynik na wyjściu.

Przykład 5:

Pliki nagłówkowe zawarte w tym kodzie to „iostream”, „fstream”, „opcjonalny” i „string”. „fstream” zawiera definicję obu funkcji „ofstream” i „ifstream”, których potrzebujemy w tym kodzie. Teraz dołączamy „przestrzeń nazw std”, więc nie umieszczamy jej osobno dla każdej funkcji. Następnie wykorzystujemy „std:opcjonalne” i deklarujemy funkcję o nazwie „ReadFileFunc”, w której jako argument przekazujemy „const string& f_Name”.

Następnie mamy „ifstream”, który pomaga odczytać plik, którego nazwa zostanie dodana do zmiennej „f_name”. Następnie używamy „if”, w którym uwzględniamy warunek, który mówi, że jeśli plik nie zostanie otwarty, zwróci „nullopt”, tak jak dodaliśmy go pod instrukcją „if”. Następnie tworzymy kolejną funkcję „fileContent”, która pomaga w zapisaniu zawartości do pliku, jeśli plik zostanie otwarty. Tutaj ponownie umieszczamy „return fileContent”, który zwraca również treść, którą dodaliśmy do pliku po otwarciu.

Teraz wywołujemy tutaj funkcję „main()”, w której inicjujemy zmienną „f_Name” nazwą pliku „Sample.txt”, który chcemy otworzyć. Następnie wywołujemy tutaj funkcję „ReadFileFunc()” i przekazujemy w tej funkcji zmienną „f_Name”, która próbuje odczytać plik i przechowuje jego zawartość w zmiennej „f_content”. Poniżej tego używamy „has_value()” ze zmienną „f_content” w „if”. Jeśli ta zmienna zawiera wartość, również ją renderuje, ponieważ dodaliśmy „cout” poniżej „if”, w którym umieściliśmy również „f_content”. W przeciwnym razie pokazuje błąd, który dodaliśmy po „else”.

Kod 5:

#include

#include

#include

#include

używając przestrzeni nazw std ;

opcjonalny < strunowy > ReadFileFunc ( konst strunowy & imię_f ) {

ifstream mój plik ( imię_f ) ;

Jeśli ( ! mój plik. jest otwarte ( ) ) {

powrót nullopt ;

}

zawartość pliku tekstowego ( ( isstreambuf_iterator < zwęglać > ( mój plik ) ) , isstreambuf_iterator < zwęglać > ( ) ) ;

powrót zawartość pliku ;

}

wew główny ( ) {

konst ciąg f_Nazwa = „Przykładowy plik.txt” ;

automatyczny f_treść = ReadFileFunc ( imię_f ) ;

Jeśli ( f_treść. ma_wartość ( ) ) {

cout << „Zawartość pliku to: \N ' << f_treść. wartość ( ) << koniec ;

} w przeciwnym razie {

cer << „Błąd: nie otwarto tutaj pliku” << imię_f << koniec ;

}

powrót 0 ;

}

Wyjście:

Tutaj pokazuje instrukcję błędu, którą dodaliśmy w części „else” jako wynik danego kodu.

Wniosek

W tym samouczku zbadaliśmy silną funkcję C++, jaką jest „std::opcjonalna” i wyjaśniliśmy, że oferuje ona ustandaryzowaną metodę reprezentowania wartości opcjonalnych, eliminując wymóg stosowania odwołań zerowych i zwiększając przejrzystość i bezpieczeństwo kodu. Dowiedzieliśmy się, że poprawia to także umiejętność wyjaśniania skomplikowanych zagadnień i radzenia sobie z błędami z wdziękiem.