C++ Operator โอเวอร์โหลดด้วยตัวอย่าง
ความหมายของ Operaทอร์โอเวอร์โหลดเหรอ?
การใช้ ตัวดำเนินการมากเกินไป in C++คุณสามารถระบุความหมายมากกว่าหนึ่งความหมายสำหรับตัวดำเนินการในขอบเขตเดียวได้ วัตถุประสงค์ของการโอเวอร์โหลดตัวดำเนินการคือเพื่อให้ความหมายพิเศษของตัวดำเนินการสำหรับประเภทข้อมูลที่ผู้ใช้กำหนด
ด้วยความช่วยเหลือของการโอเวอร์โหลดตัวดำเนินการ คุณสามารถกำหนดส่วนใหญ่ของใหม่ได้ C++ ตัวดำเนินการ นอกจากนี้คุณยังสามารถใช้การโอเวอร์โหลดตัวดำเนินการเพื่อดำเนินการต่างๆ โดยใช้ตัวดำเนินการตัวเดียวได้
วากยสัมพันธ์
การโอเวอร์โหลด C++ ตัวดำเนินการ คุณควรกำหนดฟังก์ชันพิเศษภายในคลาสดังต่อไปนี้:
class class_name { ... .. ... public return_type operator symbol (argument(s)) { ... .. ... } ... .. ... };
นี่คือคำอธิบายสำหรับไวยากรณ์ข้างต้น:
- return_type คือประเภทการส่งคืนสำหรับฟังก์ชัน
- ต่อไปคุณกล่าวถึงคำสำคัญของตัวดำเนินการ
- สัญลักษณ์นี้หมายถึงสัญลักษณ์ตัวดำเนินการที่ต้องการโอเวอร์โหลด ตัวอย่างเช่น +, -, <, ++
- สามารถส่งอาร์กิวเมนต์ไปยังฟังก์ชันตัวดำเนินการได้ในลักษณะเดียวกับฟังก์ชัน
1 ตัวอย่าง
#include <iostream> using namespace std; class TestClass { private: int count; public: TestClass() : count(5) {} void operator --() { count = count - 3; } void Display() { cout << "Count: " << count; } }; int main() { TestClass tc; --tc; tc.Display(); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ TestClass
- ใช้ตัวแก้ไขการเข้าถึงส่วนตัว ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
- สร้างการนับตัวแปรจำนวนเต็ม ตัวแปรนี้จะสามารถเข้าถึงได้แบบส่วนตัว
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะ ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
- ใช้ตัวสร้างคลาสเพื่อเริ่มต้นตัวนับตัวแปรเป็น 5
- โอเวอร์โหลดความหมายของตัวดำเนินการ —
- ตัวดำเนินการจะลดค่าของตัวแปร x ลง 1
- สิ้นสุดส่วนโอเวอร์โหลดของตัวดำเนินการ ตัวดำเนินการได้รับการตั้งชื่อใหม่
- การกำหนดฟังก์ชันชื่อฟังก์ชัน Display()
- พิมพ์ค่าของการนับตัวแปรควบคู่ไปกับข้อความอื่นบนคอนโซลเมื่อมีการเรียกใช้ฟังก์ชัน Display() } เป็นจุดสิ้นสุดของส่วนเนื้อหาของฟังก์ชัน Display()
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในฟังก์ชันนี้
- สร้างอินสแตนซ์ของคลาส TestClass และตั้งชื่อให้ว่า tc
- นี่จะเป็นการเรียกใช้ฟังก์ชันตัวดำเนินการ void –()
- ใช้ท่าทางของคลาส TestClass เพื่อเรียกใช้ฟังก์ชัน Display()
- ฟังก์ชันจะต้องคืนค่าเมื่อดำเนินการเสร็จสิ้น
- ส่วนท้ายของฟังก์ชัน main()
แนวทางที่แตกต่างกันไป Operaทอร์โอเวอร์โหลดใน C++
คุณสามารถดำเนินการโอเวอร์โหลดตัวดำเนินการได้โดยการใช้งานฟังก์ชันประเภทใดประเภทหนึ่งต่อไปนี้:
- ฟังก์ชั่นสมาชิก
- ฟังก์ชั่นที่ไม่ใช่สมาชิก
- ฟังก์ชั่นเพื่อน
- ฟังก์ชันโอเวอร์โหลดตัวดำเนินการอาจเป็นฟังก์ชันสมาชิกเมื่อตัวดำเนินการด้านซ้ายเป็นอ็อบเจ็กต์ของคลาส
- เมื่อตัวดำเนินการด้านซ้ายแตกต่างกัน Operaฟังก์ชันการโอเวอร์โหลดของ Tor ควรเป็นฟังก์ชันที่ไม่ใช่สมาชิก
คุณสามารถทำให้ฟังก์ชันโอเวอร์โหลดตัวดำเนินการเป็นฟังก์ชันเพื่อนได้หากจำเป็นต้องเข้าถึงสมาชิกคลาสที่เป็นส่วนตัวและได้รับการป้องกัน
ได้ทั้งหมด C++ Operaทอร์จะโอเวอร์โหลดหรือเปล่า?
เลขที่ มี C++ ตัวดำเนินการที่ไม่สามารถโอเวอร์โหลดได้
พวกเขารวมถึง:
- :: -ตัวดำเนินการแก้ไขขอบเขต
- ?: - ตัวดำเนินการไตรภาค
- - - ตัวเลือกสมาชิก
- ขนาดของตัวดำเนินการ
- * - ตัวเลือกตัวชี้สมาชิก
สิ่งที่ต้องจำ
- ด้วยการโอเวอร์โหลดตัวดำเนินการ คุณสามารถกำหนดวิธีการทำงานของตัวดำเนินการใหม่ได้เฉพาะกับประเภทที่ผู้ใช้กำหนด (วัตถุ โครงสร้าง) เท่านั้น คุณไม่สามารถใช้กับประเภทในตัว (float, char, int เป็นต้น) ได้
- = และ & C++ ตัวดำเนินการจะโอเวอร์โหลดตามค่าเริ่มต้น ตัวอย่างเช่น คุณสามารถคัดลอกวัตถุของคลาสเดียวกันโดยตรงโดยใช้ตัวดำเนินการ =
- Operaลำดับความสำคัญของ tor จะไม่เปลี่ยนแปลงการเชื่อมโยงและลำดับความสำคัญของตัวดำเนินการ อย่างไรก็ตาม คุณสามารถเปลี่ยนลำดับการประเมินได้โดยใช้เครื่องหมายวงเล็บ
- มีตัวดำเนินการสี่ตัวที่คุณไม่สามารถโอเวอร์โหลดได้ C++ซึ่งรวมถึงตัวดำเนินการการแก้ไขขอบเขต (::), ตัวดำเนินการการเลือกสมาชิก (.), การเลือกสมาชิกผ่านตัวดำเนินการตัวชี้ไปยังฟังก์ชัน (.*) และตัวดำเนินการไตรภาค (?:)
กฎสำหรับการ Operaทอร์โอเวอร์โหลด
นี่คือกฎสำหรับ Operaทอร์โอเวอร์โหลด:
- เพื่อให้ทำงานได้ ต้องมีตัวดำเนินการอย่างน้อยหนึ่งตัวเป็นอ็อบเจ็กต์คลาสที่ผู้ใช้กำหนด
- คุณสามารถโอเวอร์โหลดตัวดำเนินการที่มีอยู่ได้เท่านั้น คุณไม่สามารถโอเวอร์โหลดตัวดำเนินการใหม่ได้
- ตัวดำเนินการบางตัวไม่สามารถโอเวอร์โหลดได้โดยใช้ฟังก์ชันเพื่อน อย่างไรก็ตาม ตัวดำเนินการเหล่านี้สามารถโอเวอร์โหลดได้โดยใช้ฟังก์ชันสมาชิก
วิธีการโอเวอร์โหลด OperaTor
1 ตัวอย่าง
#include <iostream> using namespace std; class OperatorOverload { private: int x; public: OperatorOverload() : x(10) {} void operator ++() { x = x + 2; } void Print() { cout << "The Count is: " << x; } }; int main() { OperatorOverload ov; ++ov; ov.Print(); return 0; }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ Operaทอร์โอเวอร์โหลด
- ใช้ตัวแก้ไขการเข้าถึงส่วนตัว ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
- สร้างตัวแปรจำนวนเต็ม x ตัวแปรนี้จะสามารถเข้าถึงได้แบบส่วนตัว
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะ ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
- ใช้ตัวสร้างคลาสเพื่อเริ่มต้นตัวแปร x ถึง 10
- โอเวอร์โหลดความหมายของตัวดำเนินการ ++
- ตัวดำเนินการจะเพิ่มค่าของตัวแปร x ด้วย 2
- สิ้นสุดส่วนโอเวอร์โหลดของตัวดำเนินการ ตัวดำเนินการได้รับการตั้งชื่อใหม่
- การเรียกใช้ฟังก์ชัน Print()
- พิมพ์ค่าของตัวแปร x ควบคู่ไปกับข้อความอื่นๆ บนคอนโซลเมื่อมีการเรียกใช้ฟังก์ชัน Print()
- ส่วนท้ายของฟังก์ชัน Print()
- จุดสิ้นสุดของเนื้อหาชั้นเรียน
- เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในฟังก์ชันนี้
- สร้างอินสแตนซ์ของ Operaคลาส torOverload ชื่อ ov
- นี่จะเป็นการเรียกใช้ฟังก์ชันตัวดำเนินการ void ++()
- ใช้จุดยืนของ Operaคลาส torOverload เพื่อเรียกใช้ฟังก์ชัน Print()
- ฟังก์ชันจะต้องคืนค่าเมื่อดำเนินการเสร็จสิ้น
- ส่วนท้ายของฟังก์ชัน main()
2 ตัวอย่าง
#include<iostream> using namespace std; class TestClass { private: int real, over; public: TestClass(int rl = 0, int ov = 0) { real = rl; over = ov; } TestClass operator + (TestClass const &obj) { TestClass result; result.real = real + obj.real; result.over = over + obj.over; return result; } void print() { cout << real << " + i" << over << endl; } }; int main() { TestClass c1(9, 5), c2(4, 3); TestClass c3 = c1 + c2; c3.print(); }
Output:
นี่คือภาพหน้าจอของรหัส:
คำอธิบายรหัส:
- รวมไฟล์ส่วนหัว iostream ไว้ในโปรแกรมของเราเพื่อใช้ฟังก์ชันต่างๆ
- รวมเนมสเปซมาตรฐานไว้ในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
- สร้างคลาสชื่อ TestClass { ถือเป็นจุดเริ่มต้นของเนื้อหาคลาส
- ใช้ตัวแก้ไขการเข้าถึงส่วนตัวเพื่อทำเครื่องหมายตัวแปรว่าเป็นส่วนตัว ซึ่งหมายความว่าสามารถเข้าถึงได้จากภายในคลาสเท่านั้น
- กำหนดตัวแปรจำนวนเต็มสองตัว จริงและมากกว่า
- ใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายตัวสร้างให้เป็นสาธารณะ ซึ่งหมายความว่าจะสามารถเข้าถึงได้แม้อยู่นอกคลาส
- การสร้างตัวสร้างคลาสและการเริ่มต้นไฟล์ ตัวแปร.
- เริ่มต้นค่าของตัวแปรจริง
- เริ่มต้นค่าของตัวแปรทับ
- จุดสิ้นสุดของตัวสร้าง
- แทนที่ความหมายของตัวดำเนินการ +
- สร้างผลลัพธ์ประเภทข้อมูลประเภท TestClass
- ใช้ตัวดำเนินการ + กับตัวเลขเชิงซ้อน บรรทัดนี้จะเพิ่มส่วนจริงของตัวเลขเข้ากับส่วนจริงของตัวเลขอื่น
- ใช้ตัวดำเนินการ + กับตัวเลขเชิงซ้อน บรรทัดนี้จะเพิ่มส่วนจินตภาพของตัวเลขเข้ากับส่วนจินตภาพของตัวเลขอื่น
- โปรแกรมจะคืนค่าของผลลัพธ์ของตัวแปรเมื่อดำเนินการสำเร็จ
- สิ้นสุดนิยามความหมายใหม่ของตัวดำเนินการ + นั่นคือการโอเวอร์โหลด
- เรียกเมธอด print()
- พิมพ์ตัวเลขเชิงซ้อนใหม่หลังจากการบวกบนคอนโซล
- ส่วนท้ายของฟังก์ชัน print()
- ส่วนท้ายของเนื้อหาของคลาส TestClass
- การเรียกใช้ฟังก์ชัน main()
- ส่งค่าทั้งส่วนจริงและส่วนเชิงซ้อนที่จะบวกกัน โดยส่วนแรกของ c1 จะถูกบวกกับส่วนแรกของ c2 นั่นคือ 9+4 ส่วนที่สองของ c1 จะถูกบวกกับส่วนที่สองของ c นั่นคือ 5+3
- ดำเนินการโดยใช้ตัวดำเนินการโอเวอร์โหลด + และเก็บผลลัพธ์ไว้ในตัวแปร c3
- การพิมพ์ค่าของตัวแปร c3 บนคอนโซล
- ส่วนท้ายของฟังก์ชัน main()
สรุป
- คุณสามารถระบุความหมายสำหรับ a ได้มากกว่าหนึ่งความหมาย C++ ผู้ประกอบการ ในขอบเขตเดียว
- สิ่งนี้เรียกว่าการโอเวอร์โหลดตัวดำเนินการ
- Operaการโอเวอร์โหลด Tor ให้ความหมายพิเศษของตัวดำเนินการสำหรับชนิดข้อมูลที่ผู้ใช้กำหนด
- คุณสามารถกำหนดใหม่ส่วนใหญ่ของ C++ ผู้ปฏิบัติงานผ่านการโอเวอร์โหลดของผู้ปฏิบัติงาน
- ไม่ทั้งหมด C++ ผู้ปฏิบัติงานสามารถโอเวอร์โหลดได้
- หากต้องการให้ตัวดำเนินการโอเวอร์โหลด ตัวดำเนินการอย่างน้อยหนึ่งตัวต้องเป็นอ็อบเจ็กต์ที่ผู้ใช้กำหนด
- สามารถโอเวอร์โหลดตัวดำเนินการที่มีอยู่ได้เท่านั้น ไม่สามารถโอเวอร์โหลดตัวดำเนินการใหม่ได้