การส่งค่าเทียบกับการส่งรีเฟอเรนซ์
เปรียบเทียบความแตกต่างด้านความหมายและประสิทธิภาพระหว่างการส่งแบบค่าและแบบรีเฟอเรนซ์
การส่งค่าเทียบกับการส่งรีเฟอเรนซ์ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดรีเฟอเรนซ์จึงเป็นนามแฝงของตัวแปร
- การส่งค่าเทียบกับการส่งรีเฟอเรนซ์
- รีเฟอเรนซ์ const และแนวทางการใช้งาน
- อายุการใช้งานของรีเฟอเรนซ์และรีเฟอเรนซ์ลอย