พอยน์เตอร์ฟังก์ชัน
ส่งฟังก์ชันเป็นอาร์กิวเมนต์
พอยน์เตอร์ฟังก์ชัน เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
พอยน์เตอร์ฟังก์ชันคืออะไร
พอยน์เตอร์ฟังก์ชันจะเก็บที่อยู่ของฟังก์ชันไว้ เพื่อให้คุณเรียกใช้ฟังก์ชันนั้นทางอ้อม หรือส่งต่อไปเหมือนข้อมูลได้
- ชนิดของพอยน์เตอร์จะเข้ารหัสลายเซ็นของฟังก์ชัน
- ช่วยให้ฟังก์ชันรับพฤติกรรมเป็นพารามิเตอร์ได้
#include <iostream>
int add(int a, int b) { return a + b; }
int main() {
int (*op)(int, int) = add;
std::cout << op(3, 4) << '\n';
return 0;
}การประกาศชนิด
การประกาศ int (*op)(int, int) อ่านได้ว่า: op เป็นพอยน์เตอร์ไปยังฟังก์ชันที่รับค่า int สองค่าและส่งคืนค่า int วงเล็บรอบ *op เป็นสิ่งจำเป็น
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}การเรียกใช้ผ่านพอยน์เตอร์
คุณเรียกใช้พอยน์เตอร์ฟังก์ชันได้เหมือนกับฟังก์ชันนั้นโดยตรง นอกจากนี้ยังสามารถถอดการอ้างอิงอย่างชัดเจนได้ แต่แทบไม่จำเป็นต้องทำ
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}การส่งฟังก์ชันเป็นอาร์กิวเมนต์
ฟังก์ชันสามารถรับพารามิเตอร์ชนิดพอยน์เตอร์ฟังก์ชันได้ ทำให้ผู้เรียกกำหนดพฤติกรรมแบบกำหนดเองได้
#include <iostream>
int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }
int main() {
std::cout << apply(10, doubler) << '\n';
return 0;
}การเลือกขณะทำงาน
เนื่องจากพอยน์เตอร์ฟังก์ชันเป็นตัวแปร คุณจึงตัดสินใจได้ว่าจะเรียกใช้ฟังก์ชันใดขณะที่โปรแกรมกำลังทำงาน
#include <iostream>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
bool wantAdd = true;
int (*op)(int, int) = wantAdd ? add : sub;
std::cout << op(8, 3) << '\n';
return 0;
}อาร์เรย์ของพอยน์เตอร์ฟังก์ชัน
เก็บพอยน์เตอร์ฟังก์ชันหลายตัวไว้ในอาร์เรย์ เพื่อสร้างตารางกระจายงานอย่างง่ายที่จัดทำดัชนีด้วยค่า
#include <iostream>
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main() {
int (*ops[2])(int, int) = {add, mul};
std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
return 0;
}การใช้ชนิดนามแฝง
ไวยากรณ์ของพอยน์เตอร์ดูยุ่งยาก คำสั่งกำหนดชนิดใหม่หรือชื่อแทนที่สร้างด้วย using จะทำให้ชนิดนั้นมีชื่อที่อ่านเข้าใจได้
#include <iostream>
using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }
int main() {
BinOp op = add;
std::cout << op(6, 7) << '\n';
return 0;
}พอยน์เตอร์ฟังก์ชันกับอัลกอริทึม
อัลกอริทึมมาตรฐานรับสิ่งที่เรียกใช้งานได้ และฟังก์ชันธรรมดาก็ใช้เป็นสิ่งดังกล่าวได้ ในที่นี้เงื่อนไขจะนับจำนวนเลขคู่
#include <iostream>
#include <vector>
#include <algorithm>
bool isEven(int n) { return n % 2 == 0; }
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
int c = std::count_if(v.begin(), v.end(), isEven);
std::cout << "Evens: " << c << '\n';
return 0;
}ข้อจำกัด: ไม่มีสถานะ
พอยน์เตอร์ฟังก์ชันธรรมดาไม่สามารถเก็บข้อมูลที่จับไว้ได้ หากคุณต้องจดจำบริบทระหว่างการเรียกใช้ คุณต้องใช้ตัวแปรส่วนกลาง หรือเปลี่ยนไปใช้สิ่งที่เรียกใช้งานได้ซึ่งมีความสามารถมากกว่า
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}แลมบ์ดาที่ไม่จับค่าจะถูกแปลง
แลมบ์ดาที่ไม่จับค่าใดไว้สามารถแปลงโดยปริยายเป็นพอยน์เตอร์ฟังก์ชันที่ตรงกันได้ ซึ่งเหมาะสำหรับฟังก์ชันขนาดเล็กที่เขียนไว้ในบรรทัด
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}พอยน์เตอร์ฟังก์ชันค่าว่าง
พอยน์เตอร์ฟังก์ชันสามารถเป็น nullptr ได้ ซึ่งหมายความว่าพอยน์เตอร์นั้นไม่ได้ชี้ไปที่ใดเลย โปรดตรวจสอบก่อนเรียกใช้เสมอ เพื่อหลีกเลี่ยงพฤติกรรมที่ไม่ได้กำหนด
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}ตรวจสอบอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับข้อจำกัดของพอยน์เตอร์ฟังก์ชัน
สรุปทบทวน
คุณได้เรียนรู้เกี่ยวกับพอยน์เตอร์ฟังก์ชัน:
- เก็บที่อยู่ของฟังก์ชัน และเรียกใช้ได้เหมือนฟังก์ชันนั้น
- ช่วยให้คุณส่งพฤติกรรมเป็นพารามิเตอร์และสร้างตารางกระจายงานได้
- ชื่อแทนทำให้ชนิดของพอยน์เตอร์อ่านเข้าใจได้
- ไม่สามารถเก็บสถานะได้ แต่แลมบ์ดาที่ไม่จับค่าสามารถแปลงเป็นพอยน์เตอร์เหล่านี้ได้
ถัดไป คุณจะได้รู้จัก std::function ซึ่งสามารถเก็บสิ่งที่เรียกใช้งานได้ทุกชนิด รวมถึงชนิดที่มีสถานะ
คำถามที่พบบ่อย
บทเรียน “พอยน์เตอร์ฟังก์ชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พอยน์เตอร์ฟังก์ชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พอยน์เตอร์ฟังก์ชัน”
ส่งฟังก์ชันเป็นอาร์กิวเมนต์ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “พอยน์เตอร์ฟังก์ชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พอยน์เตอร์ฟังก์ชัน
- std::function
- std::bind
- การเลือกสิ่งที่เรียกใช้งานได้