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

รีเฟอเรนซ์ const และแนวทางการใช้งาน

ส่งออบเจ็กต์ขนาดใหญ่ได้อย่างมีประสิทธิภาพและปลอดภัยด้วยรีเฟอเรนซ์ const

บทเรียน 3 จาก 413 ขั้นตอน

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

สิ่งที่การอ้างอิงแบบ const รับรอง

const T& หมายความว่า "ฉันจะไม่แก้ไขสิ่งที่ฉันอ้างถึง" และคอมไพเลอร์จะบังคับใช้กฎนี้

void print(const std::string& s) {
    // s.clear();   // ERROR: s is const
    std::cout << s;
}

เหตุใดจึงไม่ส่งแบบค่าไปเลย

การคัดลอกวัตถุขนาดใหญ่สิ้นเปลือง การอ้างอิงแบบ const แทบไม่มีต้นทุน (ภายในทำงานเหมือน pointer) และไม่เปิดโอกาสให้ฟังก์ชันแก้ไขข้อมูลของตัวเรียก

ผูกกับค่าใดก็ได้

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

void f(const std::string& s);
std::string a = "hi";
f(a);                 // lvalue
f("hello");           // temporary string
f(std::move(a));      // rvalue

การขยายอายุการใช้งาน

การผูกค่าชั่วคราวกับการอ้างอิงแบบ const จะขยายอายุการใช้งานของค่าชั่วคราวให้เท่ากับอายุการใช้งานของการอ้างอิง เหมาะสำหรับการสร้างวัตถุแบบแทรกในนิพจน์

const std::string& greeting = "Hello, " + name;
// the concatenated string lives as long as `greeting`

เมื่อใดไม่ควรใช้การอ้างอิงแบบ const

สำหรับชนิดข้อมูลที่คัดลอกได้โดยตรง (int, double, pointer) ให้ส่งแบบค่า การอ้างอิงจะเพิ่มการอ้างอิงทางอ้อมโดยไม่ช่วยประหยัดสิ่งใด

การอ้างอิงแบบ const ใน for แบบอิงช่วงข้อมูล

นี่คือรูปแบบมาตรฐานสำหรับลูปแบบอ่านอย่างเดียว ซึ่งหลีกเลี่ยงทั้งการคัดลอกและการแก้ไขข้อมูลโดยไม่ตั้งใจ

for (const auto& x : container) {
    process(x);
}

การส่งคืนการอ้างอิงแบบ const

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

class Person {
    std::string name_;
public:
    const std::string& name() const { return name_; }
};

ความถูกต้องของ const

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

ฟังก์ชันสมาชิกแบบ const

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

class Counter {
    int n_ = 0;
public:
    int value() const { return n_; }   // pure reader
    void increment() { n_++; }
};

ข้อควรระวัง: const_cast ลบ const

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

ใช้ mutable สำหรับสถานะภายใน

คีย์เวิร์ด mutable อนุญาตให้ฟังก์ชันสมาชิกแบบ const แก้ไขสมาชิกบางตัวได้ ซึ่งมีประโยชน์สำหรับการเก็บ Cache หรือการใช้ mutex

class Cache {
    mutable std::mutex mtx_;
    mutable std::optional<int> cached_;
public:
    int value() const {
        std::lock_guard<std::mutex> lk(mtx_);
        // ...
    }
};

ตรวจสอบความเข้าใจ

เหตุใดโดยทั่วไปจึงควรเขียน const std::string& แทน std::string สำหรับพารามิเตอร์

สรุปทบทวน

ใช้ const T& สำหรับพารามิเตอร์แบบอ่านอย่างเดียว ค่าที่ส่งคืนจากฟังก์ชันอ่านค่า และลูปแบบอิงช่วงข้อมูล สำหรับชนิดที่ไม่ใช่ชนิดพื้นฐานอย่างง่าย รูปแบบนี้เร็วกว่าแบบค่าและปลอดภัยกว่าการอ้างอิงที่ไม่ใช่ const

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “รีเฟอเรนซ์ const และแนวทางการใช้งาน” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รีเฟอเรนซ์ const และแนวทางการใช้งาน”

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

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

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

บทเรียน “รีเฟอเรนซ์ const และแนวทางการใช้งาน” ใช้เวลานานแค่ไหน

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

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

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

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

  1. เหตุใดรีเฟอเรนซ์จึงเป็นนามแฝงของตัวแปร
  2. การส่งค่าเทียบกับการส่งรีเฟอเรนซ์
  3. รีเฟอเรนซ์ const และแนวทางการใช้งาน
  4. อายุการใช้งานของรีเฟอเรนซ์และรีเฟอเรนซ์ลอย
← กลับไปที่ C++ Academy