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

ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์

เขียนคลาสที่มี operator() เพื่อสร้างออบเจ็กต์เรียกใช้ได้ซึ่งเก็บสถานะ

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

ฟังก์เตอร์คืออะไร

ฟังก์เตอร์ (ออบเจ็กต์ฟังก์ชัน) คือคลาสที่โอเวอร์โหลด operator() อินสแตนซ์ของฟังก์เตอร์สามารถเรียกใช้งานได้เหมือนฟังก์ชัน

struct Square {
    int operator()(int x) const { return x * x; }
};

Square sq;
std::cout << sq(5);   // 25

ทำไมไม่ใช้ฟังก์ชันธรรมดา

ฟังก์เตอร์มีสถานะ แต่ฟังก์ชันธรรมดาไม่มี สถานะช่วยให้กำหนดค่าเริ่มต้น นับจำนวน และสร้างการเรียกกลับที่มีสถานะได้

struct Counter {
    int count = 0;
    int operator()(int x) { ++count; return x; }
};

Counter c;
c(10); c(20); c(30);
std::cout << c.count;   // 3

พฤติกรรมที่กำหนดค่าได้

จัดเก็บการกำหนดค่าไว้ในสมาชิกของฟังก์เตอร์ ฟังก์เตอร์ชนิดเดียวกันสามารถใช้กับชุดพารามิเตอร์ได้หลายแบบ

struct GreaterThan {
    int threshold;
    bool operator()(int x) const { return x > threshold; }
};

GreaterThan over10{10};
over10(15);    // true
over10(5);     // false

การใช้ฟังก์เตอร์กับอัลกอริทึมของ STL

อัลกอริทึมของ STL รับสิ่งที่เรียกใช้งานได้ทุกชนิด ไม่ว่าจะเป็นฟังก์เตอร์ แลมบ์ดา หรือตัวชี้ฟังก์ชัน

std::vector<int> v = {1, 11, 5, 99, 8};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});
std::cout << *it;   // 11

ฟังก์เตอร์ที่กำหนดไว้ล่วงหน้าใน <functional>

ไลบรารีมาตรฐานมีฟังก์เตอร์สำเร็จรูปให้ใช้ เช่น std::plus, std::less, std::equal_to, std::negate และอื่น ๆ

#include <functional>
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end(), std::greater<int>{});
// sorted descending

ฟังก์เตอร์กับตัวชี้ฟังก์ชัน

โดยทั่วไปฟังก์เตอร์จะถูกฝังโค้ดได้ดีกว่า เพราะ operator() เป็นการเรียกโดยตรง ส่วนตัวชี้ฟังก์ชันมีความยืดหยุ่นมากกว่า แต่เป็นการเรียกทางอ้อม

ฟังก์เตอร์เป็นพารามิเตอร์แม่แบบ

คอนเทนเนอร์และอัลกอริทึมของ STL จำนวนมากรับฟังก์เตอร์เป็นพารามิเตอร์แม่แบบ เช่น ตัวเปรียบเทียบของเซต ฟังก์ชันแฮช และตัวจัดสรรหน่วยความจำ

std::set<int, std::greater<int>> s = {1, 2, 3};
// s iterates in descending order: 3, 2, 1

แลมบ์ดาคือฟังก์เตอร์

คอมไพเลอร์จะสร้างคลาสที่มี operator() และมีชนิดเฉพาะสำหรับแลมบ์ดาแต่ละตัว แลมบ์ดาคือรูปแบบไวยากรณ์ที่ช่วยให้เขียนฟังก์เตอร์ได้สะดวกขึ้น

เมื่อใดควรเขียนฟังก์เตอร์

ใช้ฟังก์เตอร์ที่เขียนขึ้นเองเมื่อ:

  • มีการใช้ตรรกะเดียวกันในหลายจุด เพื่อกำหนดชื่อให้ตรรกะนั้น
  • ตรรกะนั้นเป็นส่วนหนึ่งของส่วนเชื่อมต่อสาธารณะของคุณ
  • ต้องการให้สร้างด้วยการคัดลอกหรือการย้าย โดยมีพฤติกรรมเฉพาะ

เมื่อใดควรใช้แลมบ์ดาแทน

สำหรับการใช้งานครั้งเดียว แลมบ์ดาจะสั้นและเข้าใจง่ายกว่า สำหรับพฤติกรรมที่นำกลับมาใช้ใหม่ ฟังก์เตอร์ที่มีชื่อจะช่วยให้อ่านโค้ดได้ง่ายขึ้น

การประกอบร่วมกัน

รวมฟังก์เตอร์เข้าด้วยกันโดยใช้ std::bind หรือในแนวทางสมัยใหม่กว่าคือประกอบแลมบ์ดาเข้าด้วยกัน ไลบรารีเชิงฟังก์ชันอย่าง Boost ก็มีตัวประกอบให้ใช้เช่นกัน

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

ความสามารถหลักของฟังก์เตอร์เมื่อเทียบกับฟังก์ชันธรรมดาคืออะไร

สรุป

ฟังก์เตอร์คือคลาสที่มี operator() ฟังก์เตอร์เก็บสถานะ ใช้ร่วมกับอัลกอริทึมของ STL และเป็นพื้นฐานของแลมบ์ดา ใช้ฟังก์เตอร์ที่มีชื่อสำหรับพฤติกรรมที่นำกลับมาใช้ใหม่ และใช้แลมบ์ดาสำหรับตรรกะที่ใช้เพียงครั้งเดียว

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

บทเรียน “ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์”

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

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

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

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

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

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

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

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

  1. ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์
  2. การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable
  3. แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
  4. std::function และออบเจ็กต์เรียกใช้ที่ลบชนิด
← กลับไปที่ C++ Academy