C++ Std::Tùy chọn

C Std Tuy Chon



Tính năng “std :: tùy chọn” được cung cấp trong C++ 17. “std :: tùy chọn” cho phép biểu diễn các giá trị tùy chọn theo kiểu an toàn hoặc lựa chọn có một giá trị. Một lớp mẫu có tên là “std :: tùy chọn” chứa một giá trị tùy chọn có thể chứa hoặc không chứa giá trị hợp lệ. Nó là một sự thay thế an toàn hơn để biểu diễn các giá trị trống hoặc tùy chọn so với các con trỏ thô hoặc các kỹ thuật khác. “std :: tùy chọn” giảm thiểu khả năng xảy ra lỗi tham chiếu con trỏ null bằng cách yêu cầu người dùng xác minh rõ ràng xem một giá trị có tồn tại hay không trước khi truy xuất nó.

Ví dụ 1:

Các tệp tiêu đề “tùy chọn” và “iostream” được nhập vào mã này. Chúng ta phải nhập các tệp tiêu đề này để có thể dễ dàng truy cập các hàm được xác định trong chúng. Sau đó, chúng ta bao gồm “không gian tên std” để không phải nhập nó với các hàm riêng biệt như “std::Optional” và “std::cout”. Chúng tôi sử dụng “không gian tên std” ở đây. Vì vậy, bây giờ, chúng ta đặt “tùy chọn” hoặc “cout” mà không cần gõ “std” vào chúng.

Sau đó, chúng ta gọi main() và đặt “tuỳ chọn” rồi đặt thành “int” và khai báo “myNum”. Đó là cú pháp để khai báo biến “std::tuỳ chọn”. Sau đó, chúng ta khởi tạo một biến khác có tên là “value” và gán giá trị cho biến “myNum” bằng cách sử dụng hàm value_or(). Chúng ta chuyển “99” trong hàm này, do đó, nó gán “99” này cho biến “muNum” nếu không có giá trị nào hiện diện và lưu nó trong biến “value”. Sau đó, chúng ta đặt “cout” bên dưới cái này để hỗ trợ hiển thị giá trị mà chúng ta đã gán cho biến phía trên nó.







Mã 1:

#include

#include

sử dụng không gian tên std ;

int chủ yếu ( ) {

không bắt buộc < int > số của tôi ;

int giá trị = myNum. giá trị_hoặc ( 99 ) ;

cout << 'Giá trị của myNum là:' << giá trị << kết thúc ;

trở lại 0 ;

}

Đầu ra:



Ở đây, chúng ta có thể nhận thấy rằng “99” được hiển thị, điều đó có nghĩa là giá trị không có ở trên và giá trị mà chúng ta đã thêm được gán cho biến đó.







Ví dụ 2:

Trước tiên, chúng tôi bao gồm các tệp tiêu đề và đặt “không gian tên std”. Bây giờ, bên dưới hàm này, chúng ta khai báo hàm “std :: tùy chọn” là “divideFunc()”. “Cổ tức” và “số chia” là hai tham số của hàm này. Sau đó, chúng tôi sử dụng “if” bên dưới nó để thêm điều kiện cho biết “số chia != 0”. Nếu điều này được thỏa mãn, nó sẽ trả về kết quả của phép chia này khi chúng ta thêm “return” vào bên trong phần này. Ngược lại, nó trả về “nullopt”, nghĩa là không có giá trị loại an toàn. Bây giờ, chúng ta gọi hàm main(). Để suy ra “std :: tùy chọn”, chúng ta đặt “divideFunc()” và thêm “27, 3” vào đó rồi gán kết quả cho biến “thương”.

Ở đây, chúng tôi sử dụng từ khóa “auto” để nó tự động điều chỉnh kiểu dữ liệu của nó. Sau đó, chúng tôi thêm “if” trong đó chúng tôi sử dụng “has-value” để xác định xem có nhận được giá trị loại hay không. Sau đó, chúng ta đặt “cout” để hiển thị kết quả được lưu trữ trong biến “thương”, và phần “else” chứa một câu lệnh biểu thị rằng số chia bằng 0.



Mã 2:

#include

#include

sử dụng không gian tên std ;

không bắt buộc < int > chiaFunc ( int cổ tức , int dải phân cách ) {

nếu như ( dải phân cách != 0 ) {

trở lại cổ tức / dải phân cách ;

}

trở lại không có giá trị ;

}

int chủ yếu ( ) {

tự động thương số = chiaFunc ( 27 , 3 ) ;

nếu như ( thương số. has_value ( ) ) {

cout << 'Thương số là:' << thương số. giá trị ( ) << kết thúc ;

} khác {

cout << 'Số chia ở đây bằng 0' << kết thúc ;

}

trở lại 0 ;

}

Đầu ra:

Đầu ra hiển thị kết quả sau khi chia, có nghĩa là số chia không bằng 0. Trong trường hợp này, “std :: tùy chọn” được sử dụng để xác định xem một giá trị có tồn tại hay không một cách an toàn.

Ví dụ 3:

Ở đây, chúng ta đang khai báo biến “std :: tùy chọn” là “số” bên trong hàm main(). Sau đó, chúng ta sử dụng “if” trong đó chúng ta đặt hàm has_value() với biến “number” này. Điều này kiểm tra xem có giá trị hay không trong biến “số” này. Nếu biến “number” chứa một giá trị, nó sẽ hiển thị câu lệnh mà chúng ta đã thêm vào sau “if”. Nếu không, nó sẽ hiển thị câu lệnh mà chúng ta đặt sau “else”.

Bây giờ, chúng ta khởi tạo “số” bằng “92” và sử dụng lại “if” bên dưới hàm này trong đó hàm has_value() được thêm vào biến “number” trong “if làm điều kiện”. Điều này xác định xem biến “số” có giá trị hay không. Câu mà chúng ta thêm vào sau “if” sẽ được hiển thị nếu biến “number” có giá trị. Nếu không, câu lệnh mà chúng ta đặt sau “else” sẽ được hiển thị.

Mã 3:

#include

#include

int chủ yếu ( ) {

tiêu chuẩn :: không bắt buộc < int > con số ;

nếu như ( con số. has_value ( ) ) {

tiêu chuẩn :: cout << 'Số hiện có:' << con số. giá trị ( ) << tiêu chuẩn :: kết thúc ;

} khác {

tiêu chuẩn :: cout << 'Số này không có.' << tiêu chuẩn :: kết thúc ;

}

con số = 92 ;

nếu như ( con số. has_value ( ) ) {

tiêu chuẩn :: cout << 'Số hiện có:' << con số. giá trị ( ) << tiêu chuẩn :: kết thúc ;

} khác {

tiêu chuẩn :: cout << 'Số này không có.' << tiêu chuẩn :: kết thúc ;

}

trở lại 0 ;

}

Đầu ra:

Điều này hiển thị phần “else” trước tiên vì chúng tôi không gán bất kỳ giá trị nào cho biến “std :: tùy chọn”. Sau đó, chúng ta gán giá trị cho biến này để hiển thị giá trị đó ở dòng tiếp theo.

Ví dụ 4:

Bây giờ, chúng ta khai báo ba biến “std :: tùy chọn” là “n1”, “n2” và “n3”. Chúng tôi cũng gán các giá trị cho biến “n2” và “n3”, tương ứng là “29” và “45”. Biến “n1” của lớp “std :: tùy chọn” ở đây trống. Bây giờ, chúng tôi sử dụng “boolalpha” để hỗ trợ trả về ở dạng “đúng” hoặc “sai” thay vì “1” và “0”.

Sau đó, chúng tôi sử dụng các toán tử quan hệ giữa các biến “std :: tùy chọn” này và đặt từng câu lệnh bên trong “cout” để nó cũng hiển thị kết quả so sánh mà chúng tôi đã thêm. Đầu tiên, nó kiểm tra “n3 > n2”, sau đó “n3 < n2”, “n1 < n2”, “n1 == std::nullopt ”. Ở đây, “nullopt” được sử dụng để so sánh giá trị không có loại an toàn hoặc null. Sau đó, chúng tôi kiểm tra riêng “n2 == 49” và “n3 == 88” bên trong câu lệnh “cout”.

Mã 4:

#include

#include

int chủ yếu ( )

{

tiêu chuẩn :: không bắt buộc < int > n1 ;

tiêu chuẩn :: không bắt buộc < int > n2 ( 29 ) ;

tiêu chuẩn :: không bắt buộc < int > n3 ( Bốn năm ) ;

tiêu chuẩn :: cout << tiêu chuẩn :: chữ và số ;

tiêu chuẩn :: cout << 'N3 > n2' << ( n3 > n2 ) << tiêu chuẩn :: kết thúc ;

tiêu chuẩn :: cout << 'N3 < n2' << ( n3 < n2 ) << tiêu chuẩn :: kết thúc ;

tiêu chuẩn :: cout << 'N1 < n2' << ( n1 < n2 ) << tiêu chuẩn :: kết thúc ;

tiêu chuẩn :: cout << 'N1 == null ' << ( n1 == tiêu chuẩn :: không có giá trị ) << tiêu chuẩn :: kết thúc ;

tiêu chuẩn :: cout << 'N2 == 49' << ( n2 == 29 ) << tiêu chuẩn :: kết thúc ;

tiêu chuẩn :: cout << 'N3 == 88' << ( n3 == 88 ) << tiêu chuẩn :: kết thúc ;

}

Đầu ra:

Chương trình C++ mà chúng tôi đã đề cập trước đây so sánh các giá trị biến khác nhau của loại “std::không bắt buộc” trong khi đồng thời in kết quả ra đầu ra.

Ví dụ 5:

Các tệp tiêu đề được bao gồm trong mã này là “iostream”, “fstream”, “tùy chọn” và “chuỗi”. “fstream” chứa định nghĩa của cả hai hàm “ofstream” và “ifstream” mà chúng ta cần trong mã này. Bây giờ, chúng tôi bao gồm “không gian tên std”, vì vậy chúng tôi không đặt nó riêng biệt với từng chức năng. Sau đó, chúng tôi sử dụng “std:tùy chọn” và khai báo một hàm có tên “ReadFileFunc” trong đó chúng tôi chuyển “const string& f_Name” làm đối số.

Sau đó, chúng ta có “ifstream” giúp đọc tệp có tên sẽ được thêm vào biến “f_name”. Sau đó, chúng tôi sử dụng “if” trong đó chúng tôi bao gồm điều kiện cho biết nếu tệp không được mở, nó sẽ trả về “nullopt” khi chúng tôi thêm nó vào bên dưới câu lệnh “if”. Sau đó, chúng ta tạo một hàm khác là “fileContent” hỗ trợ ghi nội dung vào tệp nếu tệp được mở. Ở đây, chúng ta đặt lại “return fileContent”, nội dung này cũng trả về nội dung mà chúng ta đã thêm vào tệp sau khi mở.

Bây giờ, chúng ta gọi “main()” ở đây, trong đó chúng ta khởi tạo biến “f_Name” bằng tên tệp “Sample.txt” mà chúng ta muốn mở. Sau đó, chúng ta gọi “ReadFileFunc()” ở đây và chuyển biến “f_Name” trong hàm này để cố đọc tệp và lưu trữ nội dung của nó trong biến “f_content”. Bên dưới điều này, chúng tôi sử dụng “has_value()” với biến “f_content” trong “if”. Nếu biến này chứa một giá trị, nó cũng hiển thị giá trị đó khi chúng ta thêm “cout” bên dưới “if” trong đó chúng ta cũng đặt “f_content”. Nếu không, nó sẽ hiển thị lỗi mà chúng tôi đã thêm sau “else”.

Mã 5:

#include

#include

#include

#include

sử dụng không gian tên std ;

không bắt buộc < sợi dây > ReadFileFunc ( hằng số sợi dây & f_tên ) {

ifstream myFile ( f_tên ) ;

nếu như ( ! tập tin của tôi. đang_mở ( ) ) {

trở lại không có giá trị ;

}

nội dung tập tin chuỗi ( ( isstreambuf_iterator < ký tự > ( tập tin của tôi ) ) , isstreambuf_iterator < ký tự > ( ) ) ;

trở lại nội dung tập tin ;

}

int chủ yếu ( ) {

hằng số chuỗi f_Name = 'Mẫu.txt' ;

tự động f_content = ReadFileFunc ( f_tên ) ;

nếu như ( f_content. has_value ( ) ) {

cout << 'Nội dung của tập tin là: \N ' << f_content. giá trị ( ) << kết thúc ;

} khác {

cer << 'Lỗi: Tệp chưa được mở ở đây' << f_tên << kết thúc ;

}

trở lại 0 ;

}

Đầu ra:

Ở đây, nó hiển thị câu lệnh lỗi mà chúng tôi đã thêm vào phần “other” dưới dạng kết quả của mã đã cho.

Phần kết luận

Trong hướng dẫn này, chúng ta đã khám phá tính năng mạnh mẽ của C++ là “std :: tùy chọn” và giải thích rằng nó cung cấp một phương pháp tiêu chuẩn hóa để biểu thị các giá trị tùy chọn, loại bỏ yêu cầu về tham chiếu null và tăng cường độ rõ ràng cũng như độ an toàn của mã. Chúng tôi biết được rằng điều này cũng cải thiện khả năng giải thích các vấn đề phức tạp và xử lý sai sót một cách khéo léo.