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

การส่งค่าเทียบกับการส่งรีเฟอเรนซ์

เปรียบเทียบความแตกต่างด้านความหมายและประสิทธิภาพระหว่างการส่งแบบค่าและแบบรีเฟอเรนซ์

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

สรุปการส่งแบบค่า

เมื่อส่งอาร์กิวเมนต์แบบค่า ฟังก์ชันจะได้รับสำเนา การเปลี่ยนแปลงภายในฟังก์ชันจะไม่ส่งผลต่อตัวเรียก

void increment(int x) {
    x++;          // modifies the copy
}

int n = 5;
increment(n);
std::cout << n;   // still 5

การส่งแบบการอ้างอิง

ส่งแบบการอ้างอิงโดยใช้ & ในรายการพารามิเตอร์ ฟังก์ชันจะทำงานกับตัวแปรของตัวเรียกโดยตรง

void increment(int& x) {
    x++;
}

int n = 5;
increment(n);
std::cout << n;   // now 6

เหตุผลที่ควรส่งแบบการอ้างอิง

มีสองเหตุผล:

  • หลีกเลี่ยงการคัดลอกวัตถุขนาดใหญ่ (ด้านประสิทธิภาพ)
  • แก้ไขตัวแปรของตัวเรียก (ด้านความหมายของการทำงาน)

การอ้างอิงแบบ const: ได้ข้อดีทั้งสองด้าน

การอ้างอิงแบบ const หลีกเลี่ยงการคัดลอกโดยไม่อนุญาตให้ฟังก์ชันแก้ไขข้อมูล ใช้รูปแบบนี้กับพารามิเตอร์ข้อมูลเข้าที่ไม่ใช่ชนิดพื้นฐานอย่างง่าย

void printName(const std::string& name) {
    std::cout << name;
}

หลักจำง่าย

สำหรับพารามิเตอร์ของฟังก์ชัน:

  • คัดลอกได้ในต้นทุนต่ำ (int, double, pointer) → ส่งแบบค่า
  • คัดลอกมีต้นทุนสูงและเป็นข้อมูลอ่านอย่างเดียว → const T&
  • ฟังก์ชันแก้ไขข้อมูลของตัวเรียก → T&

การส่งแบบพอยน์เตอร์

pointer ก็ทำให้คุณแก้ไขตัวแปรของตัวเรียกได้เช่นกัน แต่ตัวเรียกต้องหาที่อยู่โดยใช้ & อย่างชัดเจน ทำให้เห็นเจตนาได้ง่าย

void increment(int* x) {
    (*x)++;
}

int n = 5;
increment(&n);

พารามิเตอร์แบบการอ้างอิงกับแบบพอยน์เตอร์

การอ้างอิงเหมาะกว่าเมื่อจำเป็นต้องมีค่าเสมอ ส่วน pointer เหมาะเมื่ออาร์กิวเมนต์เป็นตัวเลือก โดยส่ง nullptr เพื่อไม่ใช้ค่าได้

การส่งคืนแบบค่า

การส่งคืนแบบค่าเป็นค่าเริ่มต้น ด้วย RVO (การปรับปรุงประสิทธิภาพค่าที่ส่งคืน) และความหมายการย้าย โดยทั่วไปจึงเร็วพอ ๆ กับการส่งคืนแบบการอ้างอิง และปลอดภัยกว่า

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

ส่งคืนการอ้างอิงเมื่อฟังก์ชันส่งคืนวัตถุที่มีอยู่แล้วและมีอายุยืนยาวกว่าการเรียกฟังก์ชัน เช่น สมาชิกของคอนเทนเนอร์ อย่าส่งคืนการอ้างอิงไปยังตัวแปรภายในฟังก์ชัน

การผสมรูปแบบการส่งในแม่แบบ

แม่แบบมักใช้การอ้างอิงสากล (T&&) และ std::forward เพื่อคงหมวดหมู่ของค่าไว้ หัวข้อนี้จะอธิบายในหลักสูตรความหมายการย้าย

ข้อผิดพลาดที่พบบ่อย: การตัดส่วนของคลาส

ส่งคลาส Derived แบบการอ้างอิง (หรือ pointer) ไปยังพารามิเตอร์ Base การส่งแบบค่าจะตัดส่วน Derived ของวัตถุออก

class Base { /* virtual */ };
class Derived : public Base { /* members */ };

void takeByValue(Base b);    // SLICES Derived!
void takeByRef(Base& b);     // OK

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

ควรส่ง std::string ขนาดใหญ่อย่างไร หากฟังก์ชันอ่านข้อมูลเพียงอย่างเดียว

สรุปทบทวน

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

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

บทเรียน “การส่งค่าเทียบกับการส่งรีเฟอเรนซ์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การส่งค่าเทียบกับการส่งรีเฟอเรนซ์”

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

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

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

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

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

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

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

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

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