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++ ผู้ปฏิบัติงานสามารถโอเวอร์โหลดได้
- หากต้องการให้ตัวดำเนินการโอเวอร์โหลด ตัวดำเนินการอย่างน้อยหนึ่งตัวต้องเป็นอ็อบเจ็กต์ที่ผู้ใช้กำหนด
- สามารถโอเวอร์โหลดตัวดำเนินการที่มีอยู่ได้เท่านั้น ไม่สามารถโอเวอร์โหลดตัวดำเนินการใหม่ได้



