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

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 scope

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

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

  1. auto decltype และการอนุมานชนิด
  2. range-based for nullptr และ enum class
  3. นิพจน์แลมบ์ดา: การจับค่า mutable generic
  4. การผูกแบบมีโครงสร้างและ if-init ใน C++17
← กลับไปที่ C++ Academy