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

enum class แบบมีขอบเขต

การแจกแจงชนิดที่ปลอดภัย

enum class แบบมีขอบเขต เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

การแจงสมาชิกแบบธรรมดาทำให้ชื่อรั่วไหล

enum แบบคลาสสิกของภาษา C จะนำชื่อทั้งหมดไปไว้ในขอบเขตโดยรอบ และแปลงเป็น int อย่างเงียบ ๆ จึงทำให้เกิดชื่อซ้ำและการเปรียบเทียบโดยไม่ได้ตั้งใจได้ง่าย

  • การแจงสมาชิกแบบมีขอบเขตแก้ปัญหาทั้งสองประการ
  • ค่าจะอยู่ในขอบเขตและมีชนิดข้อมูลเข้มงวด
#include <iostream>
enum Color { Red, Green, Blue };
int main() {
    Color c = Green;
    int x = c; // implicit conversion to int
    std::cout << x << "\n";
}

การประกาศการแจงสมาชิกแบบมีขอบเขต

เพิ่มคีย์เวิร์ด class หรือ struct เพื่อสร้างการแจงสมาชิกแบบมีขอบเขต จากนั้นคุณต้องระบุชื่อการแจงสมาชิกกำกับค่าทุกค่า

#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Green;
    if (c == Color::Green) std::cout << "green\n";
}

ไม่มีการแปลงโดยนัย

การแจงสมาชิกแบบมีขอบเขตจะไม่เปลี่ยนเป็น int โดยนัย วิธีนี้ป้องกันข้อผิดพลาดที่เกิดจากการนำการแจงสมาชิกไปใช้ในการคำนวณโดยไม่ได้ตั้งใจ

  • หากต้องการอ่านตัวเลข คุณต้องแปลงชนิดอย่างชัดเจน
#include <iostream>
enum class Color { Red, Green, Blue };
int main() {
    Color c = Color::Blue;
    int n = static_cast<int>(c); // explicit
    std::cout << n << "\n"; // prints 2
}

ชนิดข้อมูลพื้นฐาน

โดยค่าเริ่มต้น ชนิดข้อมูลพื้นฐานคือ int แต่คุณสามารถเลือกชนิดจำนวนเต็มที่เล็กกว่าหรือเจาะจงได้ เพื่อประหยัดพื้นที่หรือให้ตรงกับโพรโทคอล

#include <iostream>
#include <cstdint>
enum class Status : std::uint8_t { Ok = 0, Warn = 1, Error = 2 };
int main() {
    Status s = Status::Warn;
    std::cout << static_cast<int>(s) << "\n";
}

ค่าที่กำหนดเอง

คุณสามารถกำหนดค่าอย่างชัดเจนให้สมาชิกของการแจงได้ ค่าที่ตามหลังค่าซึ่งกำหนดไว้อย่างชัดเจนจะนับต่อจากค่านั้น

#include <iostream>
enum class Http { Ok = 200, NotFound = 404, ServerError = 500 };
int main() {
    Http h = Http::NotFound;
    std::cout << static_cast<int>(h) << "\n";
}

การใช้การแจงสมาชิกกับคำสั่งสวิตช์

การแจงสมาชิกเหมาะอย่างยิ่งกับคำสั่ง switch การระบุทุกกรณีทำให้เจตนาชัดเจนและเปิดให้คอมไพเลอร์เตือนเมื่อมีกรณีตกหล่น

#include <iostream>
enum class Dir { North, East, South, West };
const char* name(Dir d) {
    switch (d) {
        case Dir::North: return "N";
        case Dir::East:  return "E";
        case Dir::South: return "S";
        case Dir::West:  return "W";
    }
    return "?";
}
int main() { std::cout << name(Dir::East) << "\n"; }

การแจงสมาชิกเป็นอาร์กิวเมนต์ของฟังก์ชัน

การส่งการแจงสมาชิกแบบมีขอบเขตช่วยสื่อเจตนาได้ดีกว่าการส่ง int หรือ bool เปล่า ๆ มาก คอมไพเลอร์จะบังคับให้ใช้เฉพาะค่าของการแจงสมาชิกที่ถูกต้อง

#include <iostream>
enum class Align { Left, Center, Right };
void render(const char* text, Align a) {
    std::cout << text << " aligned " << static_cast<int>(a) << "\n";
}
int main() { render("Hi", Align::Center); }

การเปรียบเทียบค่าของการแจงสมาชิก

การแจงสมาชิกแบบมีขอบเขตรองรับ == และ != ได้โดยตรง ตัวดำเนินการเชิงสัมพันธ์อย่าง (<, >) ก็ใช้ได้เช่นกัน เพราะค่าต่าง ๆ มีลำดับ

#include <iostream>
enum class Level { Low, Medium, High };
int main() {
    Level l = Level::High;
    std::cout << (l > Level::Low ? "above low\n" : "low\n");
}

แนวคิดการวนซ้ำ

การแจงสมาชิกไม่ได้วนซ้ำโดยอัตโนมัติ แต่รูปแบบที่ใช้กันทั่วไปคือการแปลงผ่านจำนวนเต็มพื้นฐาน ควรมีค่าบอกจุดสิ้นสุด เช่น Count เพื่อระบุช่วง

#include <iostream>
enum class Coin { Penny, Nickel, Dime, Count };
int main() {
    for (int i = 0; i < static_cast<int>(Coin::Count); ++i)
        std::cout << i << " ";
    std::cout << "\n";
}

เหตุใดความปลอดภัยด้านชนิดข้อมูลจึงสำคัญ

การแจงสมาชิกแบบมีขอบเขตสองชุดที่ไม่เกี่ยวข้องกันจะไม่สามารถนำมาผสมกันโดยไม่ได้ตั้งใจได้ แม้ทั้งสองชุดจะมีค่าชื่อ None คอมไพเลอร์ถือว่าทั้งสองชุดเป็นชนิดข้อมูลที่แตกต่างกัน

#include <iostream>
enum class Fruit { None, Apple };
enum class Tool  { None, Hammer };
int main() {
    Fruit f = Fruit::None;
    // Tool t = f; // would NOT compile
    std::cout << (f == Fruit::None) << "\n";
}

ควรใช้การแจงสมาชิกแบบธรรมดาเมื่อใด

การแจงสมาชิกแบบธรรมดายังคงพบได้ในส่วนเชื่อมต่อรุ่นเก่าและโค้ดแฟล็กบิต ซึ่งการแปลงเป็น int โดยนัยมีประโยชน์ สำหรับโค้ดใหม่ ควรเลือกใช้การแจงสมาชิกแบบมีขอบเขต เว้นแต่จะมีเหตุผลเฉพาะ

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการแจงสมาชิกแบบมีขอบเขตของคุณ

สรุปทบทวน

คุณได้เรียนรู้เรื่องการแจงสมาชิกแบบมีขอบเขต:

  • enum class กำหนดขอบเขตให้ค่าและป้องกันการแปลงเป็น int โดยนัย
  • ใช้ static_cast<int> เพื่ออ่านตัวเลข
  • เลือกชนิดข้อมูลพื้นฐานด้วย : type
  • เลือกใช้ enum class เพื่อให้โค้ดปลอดภัยด้านชนิดข้อมูลและอธิบายตัวเองได้

คำถามที่พบบ่อย

บทเรียน “enum class แบบมีขอบเขต” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “enum class แบบมีขอบเขต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “enum class แบบมีขอบเขต”

การแจกแจงชนิดที่ปลอดภัย คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “enum class แบบมีขอบเขต” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. enum class แบบมีขอบเขต
  2. ยูเนียนและความเสี่ยง
  3. std::variant
  4. std::visit
← กลับไปที่ C++ Academy