range-based for nullptr และ enum class
ใช้ความสะดวกของ C++11 ได้แก่ range-based for, nullptr และ enum ที่มีชนิดชัดเจน
range-based for nullptr และ enum class เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เคล็ดลับปรับปรุงด่วนสามข้อใน C++11
C++11 นำการปรับปรุงเล็ก ๆ มากมายมาให้ มีสามอย่างที่คุณจะใช้ทุกวัน ได้แก่ range-based for, nullptr และ enum class
ทบทวน for แบบอิงช่วง
วนซ้ำผ่านคอนเทนเนอร์ใด ๆ ที่มี begin() และ end() ได้โดยไม่ต้องคำนวณดัชนี
for (const auto& x : v) {
process(x);
}สิ่งที่มาแทนที่
ลูปที่ใช้ตัววนซ้ำและมีโค้ดยืดยาวจะกลายเป็นโค้ดเพียงบรรทัดเดียว
// Before C++11
for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
process(*it);
}nullptr ดีกว่า NULL
nullptr เป็นลิเทอรัลพอยน์เตอร์ว่างที่มีชนิดข้อมูล ช่วยหลีกเลี่ยงความกำกวมในการเลือกฟังก์ชันโอเวอร์โหลดของ NULL ซึ่งเป็นแมโครแทนค่า 0
void f(int);
void f(int*);
f(NULL); // calls f(int)
f(nullptr); // calls f(int*)เหตุใด nullptr จึงดีกว่า
ใช้ nullptr อย่างสม่ำเสมอ:
- มีชนิดข้อมูลแยกต่างหาก (
std::nullptr_t) - สื่อเจตนาได้ชัดเจนกว่า
- ใช้ได้ในการเขียนเมทาโปรแกรมด้วยเทมเพลต
- ไม่สามารถแปลงเป็น
intโดยไม่ตั้งใจ
enum แบบธรรมดา: จุดพลาดง่าย
enum แบบเก่าจะทำให้ชื่อรั่วเข้าสู่ขอบเขตที่ครอบอยู่ และแปลงเป็น int โดยอัตโนมัติ
enum Color { RED, GREEN, BLUE };
int c = RED; // implicit conversion, no warning
// RED, GREEN, BLUE leak into global scopeenum class: มีขอบเขตและชนิดข้อมูลชัดเจน
C++11 enum class กำหนดให้ต้องระบุขอบเขต และห้ามแปลงเป็น int โดยอัตโนมัติ
enum class Color { Red, Green, Blue };
Color c = Color::Red;
// int n = Color::Red; // ERROR
std::cout << static_cast<int>(c); // explicit conversionการระบุชนิดข้อมูลพื้นฐาน
คุณสามารถกำหนดขนาดพื้นที่จัดเก็บของ enum class ให้เป็นชนิดจำนวนเต็มที่ต้องการได้
enum class Status : uint8_t { OK = 0, FAIL = 1, RETRY = 2 };การประกาศ enum class ล่วงหน้า
เนื่องจากทราบชนิดข้อมูลพื้นฐานแล้ว จึงประกาศ enum class ล่วงหน้าได้ — มีประโยชน์สำหรับแยกการรวมไฟล์ส่วนหัว
// header A
enum class Color : int;
// header B (full definition)
enum class Color : int { Red, Green, Blue };เมื่อ enum แบบธรรมดาใช้ได้
enum แบบธรรมดายังมีกรณีที่เหมาะสม เช่น บิตมาสก์ของแฟล็กจำนวนเต็มที่คุณต้องการให้แปลงชนิดโดยอัตโนมัติจริง ๆ โปรดบันทึกเหตุผลของตัวเลือกด้านการออกแบบนี้ไว้อย่างชัดเจน
เคล็ดลับการย้ายระบบ
เมื่อปรับปรุงฐานโค้ดให้ทันสมัย ให้เปลี่ยน enum แบบธรรมดาเป็น enum class ทีละน้อย ค้นหาจุดที่อาศัยการแปลงเป็น int โดยอัตโนมัติ แล้วเพิ่ม static_cast
ตรวจสอบความเข้าใจ
อะไรทำให้ enum class ปลอดภัยกว่า enum แบบธรรมดา
สรุปทบทวน
เคล็ดลับปรับปรุงด่วนสามข้อใน C++11 ได้แก่ for แบบอิงช่วงที่ช่วยลดโค้ดประกอบของตัววนซ้ำ nullptr ที่มาแทน NULL และ enum class ที่ให้ enum ซึ่งมีขอบเขตและชนิดข้อมูลปลอดภัย ใช้ทั้งสามอย่างเป็นค่าเริ่มต้น
คำถามที่พบบ่อย
บทเรียน “range-based for nullptr และ enum class” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “range-based for nullptr และ enum class” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “range-based for nullptr และ enum class”
ใช้ความสะดวกของ C++11 ได้แก่ range-based for, nullptr และ enum ที่มีชนิดชัดเจน คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “range-based for nullptr และ enum class” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- auto decltype และการอนุมานชนิด
- range-based for nullptr และ enum class
- นิพจน์แลมบ์ดา: การจับค่า mutable generic
- การผูกแบบมีโครงสร้างและ if-init ใน C++17