C ++ เป็นภาษาโปรแกรมทั่วไปที่ยืดหยุ่น มันถูกสร้างขึ้นโดย บียาร์น สตรูสทรัพ, นักวิทยาศาสตร์คอมพิวเตอร์ชาวเดนมาร์ก ย้อนกลับไปในปี 1985 C++ รองรับวิธีการส่งผ่านสามพารามิเตอร์ เช่น การเรียกตามค่า การเรียกตามที่อยู่ และการโทรโดยการอ้างอิง ในบทความนี้ เราจะมาพูดถึงเรื่อง call by address และ call by reference mechanism
ฟังก์ชั่นคืออะไร?
ก่อนที่เราจะเข้าสู่หัวข้อจริง เราต้องเข้าใจว่าฟังก์ชันใน C++ คืออะไร หลายๆ ท่านอาจจะคุ้นเคยกับฟังก์ชั่นต่างๆ อยู่แล้ว
ฟังก์ชันนั้นเป็นโค้ดที่สามารถใช้ทำงานบางอย่างได้ ฟังก์ชันส่วนใหญ่จะใช้เพื่อลดการซ้ำซ้อนของโค้ดในโปรแกรม C++ รับอินพุตเป็นพารามิเตอร์และส่งกลับเอาต์พุตเป็นค่าส่งคืน หากเรากำหนดฟังก์ชันเพียงครั้งเดียว เราสามารถเรียก/ใช้งานได้หลายครั้งในส่วนหลังของโปรแกรม ด้วยวิธีนี้ เราบันทึกโค้ดที่ซ้ำกันจำนวนมากในโปรแกรม
ทุกโปรแกรม C++ จะต้องมีฟังก์ชั่น main() ฟังก์ชัน main() คือจุดเริ่มต้นสำหรับโปรแกรม C++ นอกเหนือจากฟังก์ชัน main() แล้ว โปรแกรมเมอร์สามารถกำหนดฟังก์ชันได้มากเท่าที่ต้องการ
นี่คือไวยากรณ์ของการกำหนดฟังก์ชัน:
Return_type Function_Name(อินพุตพารามิเตอร์ List)
ฟังก์ชันใน C++ สามารถรับพารามิเตอร์อินพุตได้ตั้งแต่ 0 ตัวขึ้นไป ในขณะที่สามารถคืนค่าส่งคืนได้เพียงค่าเดียว
ที่อยู่คืออะไร?
ตัวแปรในภาษา C++ มี 2 ประเภท (คล้ายกับภาษา C) – Data Variable และ Address Variable ตัวแปรที่อยู่ใช้เพื่อเก็บที่อยู่ของตัวแปรข้อมูลอื่น ตัวอย่างเช่น ลองพิจารณาข้อมูลโค้ดต่อไปนี้:
intผม= 100;
int *ptr= &ผม;
ในที่นี้ คำสั่งแรกบอกเราว่าตัวแปร i เป็นตัวแปรข้อมูล และมันกำลังเก็บค่า 100 ในคำสั่งที่สอง เรากำลังประกาศตัวแปรตัวชี้ นั่นคือ ptr และเริ่มต้นมันด้วยที่อยู่ของตัวแปร i
อ้างอิงคืออะไร?
ข้อมูลอ้างอิงเป็นคุณลักษณะที่มีประสิทธิภาพอีกอย่างหนึ่งของภาษา C++ ลองพิจารณาข้อมูลโค้ดต่อไปนี้:
intถึง= 200;int &NS=ถึง;
ในตัวอย่างนี้ เราได้ประกาศจำนวนเต็ม นั่นคือ a แล้วจึงประกาศตัวแปรอ้างอิง r ซึ่งเริ่มต้นด้วยค่าของ a ดังนั้น ตัวแปรอ้างอิงจึงเป็นเพียงนามแฝงของตัวแปรอื่น
วิธีการส่งผ่านพารามิเตอร์:
วิธีการส่งพารามิเตอร์ในภาษา C++ มีสามประเภท:
- โทรตามมูลค่า / ผ่านตามมูลค่า
- โทรตามที่อยู่ / ผ่านตามที่อยู่
- โทรโดยอ้างอิง / ผ่านโดยอ้างอิง
ในบทความนี้ เรากำลังพูดถึง – Call by address และ Call by reference
Call By Address / Pass by address คืออะไร?
ในกรณีของวิธี Call by address / Pass by address อาร์กิวเมนต์ของฟังก์ชันจะถูกส่งผ่านเป็น address ฟังก์ชันผู้โทรส่งที่อยู่ของพารามิเตอร์ ตัวแปรตัวชี้ถูกใช้ในการกำหนดฟังก์ชัน ด้วยความช่วยเหลือของวิธีการโทรตามที่อยู่ ฟังก์ชันสามารถเข้าถึงพารามิเตอร์จริงและแก้ไขได้ เราจะเห็นตัวอย่างของวิธีการโทรตามที่อยู่ในส่วนท้ายของบทความนี้
Call By Reference / Pass by Reference คืออะไร?
ในวิธี Call by reference / Pass by reference พารามิเตอร์ของฟังก์ชันจะถูกส่งผ่านเป็นข้อมูลอ้างอิง ภายในนิยามฟังก์ชัน พารามิเตอร์จริงสามารถเข้าถึงได้โดยใช้ตัวแปรอ้างอิง
ตัวอย่าง:
ตอนนี้ เนื่องจากเราเข้าใจแนวคิดของวิธีการส่งผ่านพารามิเตอร์ เราจะเห็นโปรแกรมตัวอย่างหลายโปรแกรมเพื่อทำความเข้าใจกลไกการส่งพารามิเตอร์ใน C++:
- ตัวอย่าง-1 – โทรตามที่อยู่ (1)
- ตัวอย่างที่ 2 – โทรตามที่อยู่ (2)
- ตัวอย่างที่ 3 – โทรโดยอ้างอิง (1)
- ตัวอย่างที่ 4 – โทรโดยอ้างอิง (2)
ตัวอย่างสองตัวอย่างแรกมีไว้เพื่ออธิบายว่าวิธีการโทรตามที่อยู่ทำงานอย่างไรใน C ++ สองตัวอย่างสุดท้ายคือการอธิบายแนวคิด Call by reference
ตัวอย่าง-1 – โทรตามที่อยู่ (1)
ในตัวอย่างนี้ เราจะสาธิตกลไกการโทรตามที่อยู่ จากฟังก์ชัน main() เรากำลังเรียกใช้ฟังก์ชัน hello() และส่งที่อยู่ของ var ในการกำหนดฟังก์ชัน เราได้รับที่อยู่ของ var ในตัวแปรพอยน์เตอร์ นั่นคือ p ภายในฟังก์ชันสวัสดี ค่าของ var จะถูกเปลี่ยนเป็น 200 โดยใช้ตัวชี้ ดังนั้น ค่าของ var จะเปลี่ยนเป็น 200 ภายในฟังก์ชัน main() หลังจากการเรียกใช้ฟังก์ชัน hello()
#รวมโดยใช้ เนมสเปซชั่วโมง;
โมฆะสวัสดี(int *NS)
{
ค่าใช้จ่าย <<endl<< 'ภายในสวัสดี () ฟังก์ชั่น: ' <<endl;
ค่าใช้จ่าย << 'ค่าของ *p = ' << *NS<<endl;
*NS= 200;
ค่าใช้จ่าย << 'ค่าของ *p = ' << *NS<<endl;
ค่าใช้จ่าย << 'ออกจากฟังก์ชันสวัสดี ()' <<endl;
}
intหลัก()
{
intที่ไหน= 100;
ค่าใช้จ่าย << 'ค่าของ var ภายในฟังก์ชัน main() = ' <<ที่ไหน<<endl;
สวัสดี(&ที่ไหน);
ค่าใช้จ่าย <<endl<< 'ค่าของ var ภายในฟังก์ชัน main() = ' <<ที่ไหน<<endl;
กลับ 0;
}
ตัวอย่างที่ 2 – โทรตามที่อยู่ (2)
นี่เป็นอีกตัวอย่างหนึ่งของวิธีการโทรตามที่อยู่ ในตัวอย่างนี้ เราจะอธิบายวิธีการใช้ call by address method เพื่อแก้ปัญหาในชีวิตจริง ตัวอย่างเช่น เราต้องการเขียนฟังก์ชันเพื่อสลับสองตัวแปร หากเราใช้กลไกการเรียกตามค่าเพื่อสลับสองตัวแปร ตัวแปรจริงจะไม่ถูกสลับในฟังก์ชันผู้เรียก วิธีการโทรตามที่อยู่สามารถใช้ในสถานการณ์ดังกล่าวได้ ในตัวอย่างนี้ เรากำลังส่งที่อยู่ของทั้ง var_1 (&var_1) และ var_2 (&var_2) ไปยังฟังก์ชัน mySwap() ภายในฟังก์ชัน mySwap() เรากำลังสลับค่าของตัวแปรทั้งสองนี้ด้วยความช่วยเหลือของพอยน์เตอร์ ดังที่คุณเห็นในผลลัพธ์ด้านล่าง ค่าจริงของตัวแปรเหล่านี้จะถูกสลับในฟังก์ชัน main() หลังจากดำเนินการฟังก์ชัน mySwap()
#รวมโดยใช้ เนมสเปซชั่วโมง;
โมฆะmySwap(int *vptr_1,int *vptr_2)
{
inttemp_var;
temp_var= *vptr_1;
*vptr_1= *vptr_2;
*vptr_2=temp_var;
}
intหลัก()
{
intvar_1= 100;
intvar_2= 300;
ค่าใช้จ่าย << 'ก่อนที่จะเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_1 : ' <<var_1<<endl;
ค่าใช้จ่าย << 'ก่อนที่จะเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_2 : ' <<var_2<<endl<<endl;
ค่าใช้จ่าย << 'การเรียกฟังก์ชัน mySwap () - โทรตามที่อยู่' <<endl<<endl;
mySwap(&var_1,&var_2);
ค่าใช้จ่าย << 'หลังจากเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_1 : ' <<var_1<<endl;
ค่าใช้จ่าย << 'หลังจากเรียกใช้ฟังก์ชัน mySwap() แล้ว ค่าของ var_2 : ' <<var_2<<endl;
กลับ 0;
}
ตัวอย่างที่ 3 – โทรโดยอ้างอิง (1)
ในตัวอย่างนี้ เราจะสาธิตวิธีการทำงานของการโทรโดยการอ้างอิงใน C++ ในนิยามฟังก์ชัน hello() ค่าที่ได้รับเป็นตัวแปรอ้างอิง (&p) ด้วยความช่วยเหลือของตัวแปรอ้างอิง (เช่น p) เราสามารถเปลี่ยนค่าของพารามิเตอร์จริง (var) ภายในฟังก์ชัน main() ได้
#รวมโดยใช้ เนมสเปซชั่วโมง;
โมฆะสวัสดี(int &NS)
{
ค่าใช้จ่าย <<endl<< 'ภายในสวัสดี () ฟังก์ชั่น: ' <<endl;
ค่าใช้จ่าย << 'ค่าของ p = ' <<NS<<endl;
NS= 200;
ค่าใช้จ่าย << 'ค่าของ p = ' <<NS<<endl;
ค่าใช้จ่าย << 'ออกจากฟังก์ชันสวัสดี ()' <<endl;
}
intหลัก()
{
intที่ไหน= 100;
ค่าใช้จ่าย << 'ค่าของ var ภายในฟังก์ชัน main() = ' <<ที่ไหน<<endl;
สวัสดี(ที่ไหน);
ค่าใช้จ่าย <<endl<< 'ค่าของ var ภายในฟังก์ชัน main() = ' <<ที่ไหน<<endl;
กลับ 0;
}
ตัวอย่างที่ 4 – โทรโดยการอ้างอิง(2)
นี่เป็นอีกตัวอย่างหนึ่งของการโทรโดยอ้างอิง ในตัวอย่างนี้ เราจะสาธิตวิธีการทำงานของ call by reference ใน C++ โดยใช้ตัวอย่างในโลกแห่งความเป็นจริง ฟังก์ชัน mySwap() ถูกเรียกจากฟังก์ชัน main() ด้วยพารามิเตอร์ต่อไปนี้ – var_1 และ var_2 ภายในฟังก์ชัน mySwap() เราได้รับพารามิเตอร์เป็นตัวแปรอ้างอิง
#รวมโดยใช้ เนมสเปซชั่วโมง;
โมฆะmySwap(int &vref_1,int &vref_2)
{
inttemp_var;
temp_var=vref_1;
vref_1=vref_2;
vref_2=temp_var;
}
intหลัก()
{
intvar_1= 100;
intvar_2= 300;
ค่าใช้จ่าย << 'ก่อนที่จะเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_1 : ' <<var_1<<endl;
ค่าใช้จ่าย << 'ก่อนที่จะเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_2 : ' <<var_2<<endl<<endl;
ค่าใช้จ่าย << 'การเรียกฟังก์ชัน mySwap () - โทรโดยการอ้างอิง' <<endl<<endl;
mySwap(var_1, var_2);
ค่าใช้จ่าย << 'หลังจากเรียกใช้ฟังก์ชัน mySwap() ค่าของ var_1 : ' <<var_1<<endl;
ค่าใช้จ่าย << 'หลังจากเรียกใช้ฟังก์ชัน mySwap() แล้ว ค่าของ var_2 : ' <<var_2<<endl;
กลับ 0;
}
บทสรุป
การทำความเข้าใจวิธีการส่งผ่านพารามิเตอร์ใน ค ++ เป็นสิ่งสำคัญมาก ภาษาการเขียนโปรแกรม C รองรับ Call by value และ Call by address เท่านั้น แต่ C++ รองรับการโทรโดยอ้างอิงพร้อมกับกลไกสองอย่างก่อนหน้านี้ ในบทความนี้ เราได้เห็นตัวอย่างการทำงานหลายอย่างเพื่อทำความเข้าใจแนวคิดของการโทรตามที่อยู่และการโทรโดยการอ้างอิง การโทรตามที่อยู่เป็นวิธีที่มีประสิทธิภาพและเป็นที่นิยมในแอปพลิเคชันโดเมนแบบฝัง