การแทนค่าที่ไม่มีอยู่ด้วย optional
หลีกเลี่ยงพอยน์เตอร์ null
การแทนค่าที่ไม่มีอยู่ด้วย optional เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหาของค่าว่าง
การส่งคืนค่าพิเศษบ่งชี้ เช่น -1 หรือตัวชี้ค่าว่างเพื่อหมายถึง "ไม่มีค่า" มีความเปราะบางและนำไปใช้ผิดได้ง่าย std::optional<T> แสดงความหมายว่า "มีค่าหรือไม่มีอะไรเลย" อย่างชัดเจน ให้รวม <optional>
#include <iostream>
#include <optional>
int main() {
std::optional<int> maybe = 42;
std::cout << *maybe << "\n";
}ออปชันนัลว่าง
การสร้างออปชันนัลด้วยค่าเริ่มต้น หรือการกำหนดค่า std::nullopt จะทำให้ได้ออปชันนัลว่างที่ไม่มีค่าใดเก็บอยู่
#include <iostream>
#include <optional>
int main() {
std::optional<int> empty;
std::optional<int> also = std::nullopt;
std::cout << empty.has_value() << " " << also.has_value() << "\n";
}การตรวจสอบว่ามีค่า
เรียกใช้ has_value() หรือใช้ออปชันนัลโดยตรงในบริบทบูลีนเพื่อตรวจสอบว่ามีสิ่งใดเก็บอยู่หรือไม่
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 5;
if (o) std::cout << "has value\n";
if (o.has_value()) std::cout << "yes\n";
}ออปชันนัลในฐานะชนิดค่าที่ส่งคืน
เหมาะอย่างยิ่งสำหรับฟังก์ชันที่อาจสร้างผลลัพธ์ไม่สำเร็จ ให้ส่งคืนค่าเมื่อสำเร็จ และส่งคืน std::nullopt เมื่อไม่สำเร็จ
#include <iostream>
#include <optional>
std::optional<int> half(int n) {
if (n % 2 == 0) return n / 2;
return std::nullopt;
}
int main() {
auto r = half(10);
if (r) std::cout << *r << "\n";
}การอ่านค่า
ใช้ *opt หรือ opt.value() เมื่อทราบแน่ชัดว่ามีค่าอยู่ การยกเลิกการอ้างอิงออปชันนัลว่างด้วย * เป็นพฤติกรรมไม่กำหนด
#include <iostream>
#include <optional>
int main() {
std::optional<std::string_view> name = "Ada";
if (name) std::cout << *name << "\n";
}ลายเซ็นที่อธิบายตัวเอง
ชนิดค่าที่ส่งคืนเป็น std::optional บอกผู้เรียกได้ทันทีว่าฟังก์ชันอาจไม่สร้างผลลัพธ์ โดยไม่จำเป็นต้องมีคำอธิบายเพิ่มเติม
#include <iostream>
#include <optional>
#include <string>
std::optional<std::string> getEnvName(bool present) {
if (present) return std::string("CONFIG");
return std::nullopt;
}
int main() { std::cout << getEnvName(true).has_value() << "\n"; }การรีเซ็ตออปชันนัล
เรียกใช้ reset() เพื่อทำให้ออปชันนัลกลับมาว่างอีกครั้ง หรือกำหนดค่าเป็น std::nullopt
#include <iostream>
#include <optional>
int main() {
std::optional<int> o = 99;
o.reset();
std::cout << o.has_value() << "\n"; // 0
}การสร้างโดยตรงภายใน
emplace สร้างค่าที่อยู่ภายในโดยตรงในออปชันนัล ทำให้ไม่ต้องคัดลอกเพิ่มเติม
#include <iostream>
#include <optional>
#include <string>
int main() {
std::optional<std::string> o;
o.emplace("built in place");
std::cout << *o << "\n";
}ออปชันนัลเทียบกับตัวชี้
ตัวชี้ดิบอาจเป็นค่าว่างได้ แต่ไม่ได้บอกอะไรเกี่ยวกับความเป็นเจ้าของ และมีความเสี่ยงที่จะกลายเป็นตัวชี้ห้อย ออปชันนัลเป็นเจ้าของค่าของตนเองโดยเก็บค่าไว้โดยตรง และสื่ออย่างชัดเจนว่า "อาจไม่มีค่า" โดยไม่ต้องจัดสรรหน่วยความจำบนฮีป
ออปชันนัลของการอ้างอิงหรือไม่
std::optional เก็บค่า ไม่ใช่การอ้างอิง หากต้องการอ้างถึงออบเจ็กต์ที่มีอยู่แล้วแบบอาจมีหรือไม่มี ให้เก็บตัวชี้ หรือใช้ std::optional<std::reference_wrapper<T>>
เมื่อใดควรเลือกใช้ Optional
ใช้สำหรับการค้นหาที่อาจไม่พบ การแยกวิเคราะห์ที่อาจไม่สำเร็จ หรือการตั้งค่าที่อาจไม่ได้กำหนด บทเรียนถัดไปจะกล่าวถึงวิธีเข้าถึงค่าที่อยู่ภายในอย่างปลอดภัย
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ตรวจสอบความเข้าใจของคุณเกี่ยวกับ std::optional
ทบทวน
คุณได้เรียนรู้พื้นฐานของ std::optional:
- แสดงความหมายว่า "มีค่าหรือไม่มีอะไรเลย" โดยไม่ใช้ค่าพิเศษบ่งชี้หรือค่าว่าง
- ทำให้ว่างได้ด้วยการสร้างด้วยค่าเริ่มต้นหรือใช้
std::nullopt - ตรวจสอบได้ด้วย
has_value()หรือการตรวจสอบแบบบูลีน - เหมาะอย่างยิ่งสำหรับใช้เป็นชนิดค่าที่ส่งคืนของการค้นหาที่อาจไม่สำเร็จ
คำถามที่พบบ่อย
บทเรียน “การแทนค่าที่ไม่มีอยู่ด้วย optional” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การแทนค่าที่ไม่มีอยู่ด้วย optional” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การแทนค่าที่ไม่มีอยู่ด้วย optional”
หลีกเลี่ยงพอยน์เตอร์ null คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การแทนค่าที่ไม่มีอยู่ด้วย optional” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแทนค่าที่ไม่มีอยู่ด้วย optional
- การเข้าถึงค่า optional
- พื้นฐาน std::expected
- รูปแบบการจัดการข้อผิดพลาด