0Pricing
C++ Academy · บทเรียน

การแทนค่าที่ไม่มีอยู่ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแทนค่าที่ไม่มีอยู่ด้วย optional
  2. การเข้าถึงค่า optional
  3. พื้นฐาน std::expected
  4. รูปแบบการจัดการข้อผิดพลาด
← กลับไปที่ C++ Academy