ฟังก์ชัน#
การแนะนำ#
ฟังก์ชันเป็นส่วนประกอบพื้นฐานของการเขียนโปรแกรมภาษา C++ โดยทำหน้าที่รวบรวมโค้ดส่วนย่อยๆ เข้าไว้ด้วยกันเป็นส่วนๆ ที่สามารถนำกลับมาใช้ซ้ำได้อย่างมีประสิทธิภาพ เพื่อทำงานเฉพาะอย่าง ฟังก์ชันสามารถถูกเรียกใช้ได้หลายครั้งในโปรแกรมเดียวกัน ทำให้การจัดระเบียบโค้ดง่ายขึ้น และช่วยหลีกเลี่ยงการเขียนโค้ดซ้ำซ้อน นอกจากนี้ ฟังก์ชันยังช่วยให้การแก้ไขข้อผิดพลาดในโค้ดง่ายขึ้นด้วย
หน้านี้ครอบคลุมพื้นฐานการใช้งานฟังก์ชันในภาษา C++ ซึ่งรวมถึง:
โครงสร้างและไวยากรณ์ของฟังก์ชัน — วิธีการเขียนฟังก์ชันใน C++ รวมถึงประเภทการส่งคืน ชื่อ และพารามิเตอร์
ต้นแบบฟังก์ชัน — ฟังก์ชันต้นแบบคืออะไรและใช้เพื่ออะไร
การกำหนดและการเรียกใช้ฟังก์ชัน — วิธีการสร้างฟังก์ชันและเรียกใช้ฟังก์ชันจากโปรแกรมของคุณ
ค่าที่ส่งคืน — ฟังก์ชันสามารถส่งข้อมูลกลับไปยังผู้เรียกได้อย่างไร
การส่งผ่านโดยการอ้างอิง — ฟังก์ชันสามารถแก้ไข ตัวแปร นอกขอบเขตของตัวเองได้อย่างไร
ฟังก์ชันเรียกกลับ — วิธีการส่งฟังก์ชันเข้าไปในฟังก์ชันอื่นและเรียกใช้งานโดยอัตโนมัติเพื่อตอบสนองต่อเหตุการณ์
ฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น — วิธีการกำหนดค่าเริ่มต้นให้กับพารามิเตอร์เมื่อไม่มีการระบุอาร์กิวเมนต์
โครงสร้างและไวยากรณ์ของฟังก์ชัน#
ในภาษา C++ ฟังก์ชันจะต้องถูกประกาศโดยระบุชนิดของค่าส่งคืน ชื่อ และพารามิเตอร์ ไวยากรณ์พื้นฐานมีดังนี้:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
ส่วนประกอบการทำงาน |
คำอธิบาย |
|---|---|
|
The data type that the function returns, some common options are:
|
|
ชื่อของฟังก์ชัน |
|
(ไม่บังคับ) รายการพารามิเตอร์ที่คั่นด้วยเครื่องหมายจุลภาค เขียนในรูปแบบ |
|
ไม่บังคับ ค่าที่ส่งคืนโดยฟังก์ชัน หาก |
หมายเหตุ: ฟังก์ชันจะต้อง ประกาศ ก่อน ที่จะเรียกใช้เสมอ หรือคุณต้องระบุ ต้นแบบฟังก์ชัน
ต้นแบบฟังก์ชัน#
ในภาษา C++ โค้ดจะถูกอ่านจากบนลงล่าง ซึ่งหมายความว่าฟังก์ชันจะต้องเป็นที่รู้จักของคอมไพเลอร์ก่อนจึงจะสามารถเรียกใช้งานได้
ต้นแบบฟังก์ชันช่วยให้คุณ ใช้งาน ฟังก์ชันได้ก่อนที่จะเขียนโค้ดทั้งหมด วิธีนี้ช่วยให้คุณเก็บ main() ใกล้ๆ ส่วนบนสุดของโปรแกรม ในขณะที่วางคำนิยามฟังก์ชันไว้ทีหลัง ซึ่งจะจัดระเบียบและอ่านง่ายกว่า
Without a prototype, you would have to define every function above main(), which can make projects harder to follow as they grow.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
void greeting() {
Brain.Screen.print("Hello!");
}
การกำหนดและการเรียกใช้ฟังก์ชัน#
Functions with No Parameters#
หากฟังก์ชันไม่ต้องการอินพุต คุณสามารถกำหนดฟังก์ชันนั้นได้โดยไม่ต้องมีพารามิเตอร์ ใช้ void เป็นประเภทการส่งคืนหากฟังก์ชันนั้นไม่ส่งคืนค่าใดๆ
// Define a function to display a message
void greeting() {
Brain.Screen.print("Hello!");
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Call the function to display the message
greeting();
}
Functions with Parameters#
นอกจากนี้ คุณยังสามารถเพิ่มพารามิเตอร์ให้กับฟังก์ชันได้ ซึ่งจะช่วยให้คุณส่งข้อมูลที่ฟังก์ชันจะนำไปใช้ได้
หมายเหตุ: สามารถส่งข้อความได้โดยใช้สตริงแบบ C (const char*) หรือสตริงแบบ C++ (std::string)
// Define a function with a parameter
void namedGreeting(const char* name) {
Brain.Screen.print("Hello, %s!", name);
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
namedGreeting("Stranger");
}
ค่าที่ส่งคืน#
ฟังก์ชันสามารถส่งข้อมูลกลับไปยังผู้เรียกโดยใช้คีย์เวิร์ด return ซึ่งช่วยให้คุณสามารถบันทึกและใช้งานผลลัพธ์ในโปรเจ็กต์ของคุณได้
// Define a function that multiplies numbers by 2
int timesTwo(int number) {
return number * 2;
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the return value
Brain.Screen.print("%d", timesTwo(2));
}
ส่งต่อโดยอ้างอิง#
By default, C++ passes function parameters by value, meaning the function receives a copy of the original variable. Changes made inside the function do not affect the original value.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
To allow a function to modify the original variable, parameters can be passed by reference using the & symbol.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will now be 6
}
การส่งผ่านโดยการอ้างอิงช่วยให้ฟังก์ชันสามารถอัปเดต ตัวแปร ที่กำหนดไว้นอกฟังก์ชันโดยไม่ต้องส่งคืนค่า
ฟังก์ชันเรียกกลับ#
ฟังก์ชันเรียกกลับ (Callback function) คือฟังก์ชันที่ถูกส่งเข้าไปในฟังก์ชันอื่น และจะถูกเรียกโดยอัตโนมัติเมื่อเกิดเหตุการณ์เฉพาะขึ้น
ฟังก์ชัน Callback มักใช้สำหรับเหตุการณ์ต่างๆ เช่น การกดปุ่ม หรือการอัปเดตข้อมูลจากเซ็นเซอร์
แทนที่จะเรียกฟังก์ชันด้วยตนเอง โครงการจะเรียกฟังก์ชันนั้นให้คุณโดยอัตโนมัติเมื่อเหตุการณ์เกิดขึ้น
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
Brain.Screen.pressed(onPressed);
}
Callback Signatures#
ฟังก์ชันเรียกกลับทุกฟังก์ชันต้องมีรูปแบบเฉพาะ ซึ่งกำหนดสิ่งต่อไปนี้:
ประเภทการส่งคืน
จำนวนพารามิเตอร์
ประเภทพารามิเตอร์
รูปแบบการลงนามที่ต้องการจะถูกกำหนดโดย API ฟังก์ชันเรียกกลับต้องตรงกับรูปแบบการลงนามนี้อย่างแม่นยำ
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
ชื่อพารามิเตอร์มีความหมายและอาจแตกต่างกันได้ แต่ประเภทค่าส่งคืน ลำดับพารามิเตอร์ และประเภทพารามิเตอร์ต้องตรงกันทุกประการ
ฟังก์ชันที่มีอาร์กิวเมนต์เริ่มต้น#
ฟังก์ชันสามารถกำหนดค่าเริ่มต้นสำหรับพารามิเตอร์หนึ่งตัวหรือมากกว่านั้นได้ ค่าเริ่มต้นจะถูกใช้เมื่อไม่มีการระบุค่าสำหรับพารามิเตอร์นั้นเมื่อเรียกใช้ฟังก์ชัน
กฎสำหรับการกำหนดค่าเริ่มต้น:
ค่าเริ่มต้น ต้องเป็น พารามิเตอร์สุดท้ายในคำจำกัดความของฟังก์ชัน
เมื่อพารามิเตอร์ใดมีค่าเริ่มต้นแล้ว พารามิเตอร์ทั้งหมดหลังจากนั้นจะต้องมีค่าเริ่มต้นด้วยเช่นกัน
หากฟังก์ชันระบุอาร์กิวเมนต์เริ่มต้นใน prototype ค่าเริ่มต้นเหล่านั้นจะต้องไม่ถูกระบุอีกครั้งในคำจำกัดความของฟังก์ชัน
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (V5) and
// use default value for repeatCount (1)
greeting("V5");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("V5", 3);
}