ตัวดำเนินการดัชนีและเรียกฟังก์ชัน
โอเวอร์โหลด [] และ () เพื่อให้ชนิดข้อมูลทำงานเหมือนคอนเทนเนอร์หรือออบเจ็กต์เรียกใช้ได้
ตัวดำเนินการดัชนีและเรียกฟังก์ชัน เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตัวดำเนินการ [] — การเข้าถึงด้วยดัชนี
โอเวอร์โหลด [] เพื่อให้ชนิดข้อมูลของคุณใช้งานได้เหมือนอาร์เรย์ มีประโยชน์สำหรับคอนเทนเนอร์ เมทริกซ์ และคลาสรูปภาพ
class Vec {
std::vector<double> data_;
public:
double& operator[](size_t i) { return data_[i]; }
double operator[](size_t i) const { return data_[i]; }
};การโอเวอร์โหลดสองแบบ: const และ non-const
ควรจัดเตรียมไว้ทั้งสองแบบ การเรียกใช้กับอินสแตนซ์ const จะเลือกการโอเวอร์โหลดแบบ const ส่วนแบบ non-const อนุญาตให้กำหนดค่าได้
การตรวจสอบขอบเขต
ตามธรรมเนียมแล้ว operator[] ธรรมดาจะไม่ตรวจสอบขอบเขต ให้จัดเตรียมเมธอด at() แยกต่างหากที่โยนข้อยกเว้น เช่นเดียวกับไลบรารีมาตรฐาน
double& at(size_t i) {
if (i >= data_.size()) throw std::out_of_range("");
return data_[i];
}ตัวห้อยหลายมิติ (C++23)
C++23 เพิ่มตัวห้อยที่คั่นด้วยจุลภาค: m[i, j] ส่วนเวอร์ชันก่อนหน้านี้ต้องใช้การเรียกฟังก์ชันหรือตัวห้อยต่อกัน
// C++23
double& operator[](size_t i, size_t j);
// Pre-C++23 workaround
double& operator()(size_t i, size_t j);ตัวดำเนินการ () — การเรียกฟังก์ชัน
โอเวอร์โหลด () เพื่อให้อินสแตนซ์สามารถเรียกใช้งานได้ ใช้กับฟังก์ชันอ็อบเจ็กต์ การเข้าถึงเมทริกซ์ และเงื่อนไขที่กำหนดค่าได้
struct Square {
int operator()(int x) const { return x * x; }
};
Square sq;
std::cout << sq(5); // 25ฟังก์ชันอ็อบเจ็กต์ที่มีสถานะ
ตัวดำเนินการเรียกฟังก์ชันทำงานร่วมกับตัวแปรสมาชิกได้ จึงเป็นสิ่งที่เรียกใช้งานได้และมีสถานะ
struct GreaterThan {
int threshold;
bool operator()(int x) const { return x > threshold; }
};
GreaterThan over10{10};
std::cout << over10(15); // trueใช้กับอัลกอริทึมของ STL
ส่งอินสแตนซ์ของฟังก์ชันอ็อบเจ็กต์ให้กับอัลกอริทึมแทนฟังก์ชัน
std::vector<int> v = {1, 11, 2, 22};
auto it = std::find_if(v.begin(), v.end(), GreaterThan{10});ตัวดำเนินการที่รับอาร์กิวเมนต์หลายตัว
ทั้ง [] (ก่อน C++23) และ () สามารถโอเวอร์โหลดให้รับอาร์กิวเมนต์จำนวนเท่าใดก็ได้ ก่อน C++23 ควรเลือก () หากต้องการการเข้าถึงลักษณะเมทริกซ์ที่ยืดหยุ่นกว่า
การคืนค่าการอ้างอิงเทียบกับค่า
คืนค่าการอ้างอิงเพื่อให้สามารถกำหนดค่าผ่านตัวห้อยได้ สำหรับชนิดข้อมูลที่อ่านได้อย่างเดียว ให้คืนค่าเป็นค่า
อ็อบเจ็กต์พร็อกซี
หาก operator[] จำเป็นต้องคืนอ็อบเจ็กต์ที่ซับซ้อน (เช่น ฟิลด์บิต) ให้คืนคลาสพร็อกซีขนาดเล็กที่มีตัวดำเนินการแปลงและกำหนดค่า
ตัวอย่างการใช้งานจริง
การใช้งานทั่วไป:
std::vector::operator[]std::map::operator[]— แทรกข้อมูลเมื่อไม่พบคีย์- คลาสเมทริกซ์:
m(i, j) - ฟังก์ชันอ็อบเจ็กต์สำหรับอัลกอริทึม
ตรวจสอบอย่างรวดเร็ว
คุณทำให้อินสแตนซ์ของคลาสเรียกใช้งานได้เหมือนฟังก์ชันได้อย่างไร
สรุปทบทวน
โอเวอร์โหลด [] สำหรับการเข้าถึงด้วยดัชนี (จัดเตรียมการโอเวอร์โหลดทั้งแบบ const และ non-const) โอเวอร์โหลด () เพื่อให้อินสแตนซ์เรียกใช้งานได้ ซึ่งเป็นพื้นฐานของฟังก์ชันอ็อบเจ็กต์และแลมบ์ดา
คำถามที่พบบ่อย
บทเรียน “ตัวดำเนินการดัชนีและเรียกฟังก์ชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวดำเนินการดัชนีและเรียกฟังก์ชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวดำเนินการดัชนีและเรียกฟังก์ชัน”
โอเวอร์โหลด [] และ () เพื่อให้ชนิดข้อมูลทำงานเหมือนคอนเทนเนอร์หรือออบเจ็กต์เรียกใช้ได้ คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวดำเนินการดัชนีและเรียกฟังก์ชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวดำเนินการเลขคณิตและการเปรียบเทียบ
- ตัวดำเนินการแทรกและดึงข้อมูลจากกระแส
- ตัวดำเนินการดัชนีและเรียกฟังก์ชัน
- ตัวดำเนินการเปรียบเทียบสามทางใน C++20