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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- enum class แบบมีขอบเขต
- ยูเนียนและความเสี่ยง
- std::variant
- std::visit