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:

Operaทอร์โอเวอร์โหลด

นี่คือภาพหน้าจอของรหัส:

Operaทอร์โอเวอร์โหลด

คำอธิบายรหัส:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมเนมสเปซมาตรฐานในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  3. สร้างคลาสชื่อ TestClass
  4. ใช้ตัวแก้ไขการเข้าถึงส่วนตัว ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
  5. สร้างการนับตัวแปรจำนวนเต็ม ตัวแปรนี้จะสามารถเข้าถึงได้แบบส่วนตัว
  6. ใช้ตัวแก้ไขการเข้าถึงสาธารณะ ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
  7. ใช้ตัวสร้างคลาสเพื่อเริ่มต้นตัวนับตัวแปรเป็น 5
  8. โอเวอร์โหลดความหมายของตัวดำเนินการ —
  9. ตัวดำเนินการจะลดค่าของตัวแปร x ลง 1
  10. สิ้นสุดส่วนโอเวอร์โหลดของตัวดำเนินการ ตัวดำเนินการได้รับการตั้งชื่อใหม่
  11. การกำหนดฟังก์ชันชื่อฟังก์ชัน Display()
  12. พิมพ์ค่าของการนับตัวแปรควบคู่ไปกับข้อความอื่นบนคอนโซลเมื่อมีการเรียกใช้ฟังก์ชัน Display() } เป็นจุดสิ้นสุดของส่วนเนื้อหาของฟังก์ชัน Display()
  13. จุดสิ้นสุดของเนื้อหาชั้นเรียน
  14. เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในฟังก์ชันนี้
  15. สร้างอินสแตนซ์ของคลาส TestClass และตั้งชื่อให้ว่า tc
  16. นี่จะเป็นการเรียกใช้ฟังก์ชันตัวดำเนินการ void –()
  17. ใช้ท่าทางของคลาส TestClass เพื่อเรียกใช้ฟังก์ชัน Display()
  18. ฟังก์ชันจะต้องคืนค่าเมื่อดำเนินการเสร็จสิ้น
  19. ส่วนท้ายของฟังก์ชัน main()

แนวทางที่แตกต่างกันไป Operaทอร์โอเวอร์โหลดใน C++

คุณสามารถดำเนินการโอเวอร์โหลดตัวดำเนินการได้โดยการใช้งานฟังก์ชันประเภทใดประเภทหนึ่งต่อไปนี้:

  1. ฟังก์ชั่นสมาชิก
  2. ฟังก์ชั่นที่ไม่ใช่สมาชิก
  3. ฟังก์ชั่นเพื่อน
  • ฟังก์ชันโอเวอร์โหลดตัวดำเนินการอาจเป็นฟังก์ชันสมาชิกเมื่อตัวดำเนินการด้านซ้ายเป็นอ็อบเจ็กต์ของคลาส
  • เมื่อตัวดำเนินการด้านซ้ายแตกต่างกัน Operaฟังก์ชันการโอเวอร์โหลดของ Tor ควรเป็นฟังก์ชันที่ไม่ใช่สมาชิก

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

ได้ทั้งหมด C++ Operaทอร์จะโอเวอร์โหลดหรือเปล่า?

เลขที่ มี C++ ตัวดำเนินการที่ไม่สามารถโอเวอร์โหลดได้

พวกเขารวมถึง:

  • :: -ตัวดำเนินการแก้ไขขอบเขต
  • ?: - ตัวดำเนินการไตรภาค
  • - - ตัวเลือกสมาชิก
  • ขนาดของตัวดำเนินการ
  • * - ตัวเลือกตัวชี้สมาชิก

สิ่งที่ต้องจำ

  1. ด้วยการโอเวอร์โหลดตัวดำเนินการ คุณสามารถกำหนดวิธีการทำงานของตัวดำเนินการใหม่ได้เฉพาะกับประเภทที่ผู้ใช้กำหนด (วัตถุ โครงสร้าง) เท่านั้น คุณไม่สามารถใช้กับประเภทในตัว (float, char, int เป็นต้น) ได้
  2. = และ & C++ ตัวดำเนินการจะโอเวอร์โหลดตามค่าเริ่มต้น ตัวอย่างเช่น คุณสามารถคัดลอกวัตถุของคลาสเดียวกันโดยตรงโดยใช้ตัวดำเนินการ =
  3. Operaลำดับความสำคัญของ tor จะไม่เปลี่ยนแปลงการเชื่อมโยงและลำดับความสำคัญของตัวดำเนินการ อย่างไรก็ตาม คุณสามารถเปลี่ยนลำดับการประเมินได้โดยใช้เครื่องหมายวงเล็บ
  4. มีตัวดำเนินการสี่ตัวที่คุณไม่สามารถโอเวอร์โหลดได้ 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:

เกินพิกัด Operaตัวอย่างทอร์

นี่คือภาพหน้าจอของรหัส:

เกินพิกัด Operaตัวอย่างทอร์

คำอธิบายรหัส:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโค้ดของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมเนมสเปซมาตรฐานในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  3. สร้างคลาสชื่อ Operaทอร์โอเวอร์โหลด
  4. ใช้ตัวแก้ไขการเข้าถึงส่วนตัว ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
  5. สร้างตัวแปรจำนวนเต็ม x ตัวแปรนี้จะสามารถเข้าถึงได้แบบส่วนตัว
  6. ใช้ตัวแก้ไขการเข้าถึงสาธารณะ ซึ่งทำเครื่องหมายสมาชิกคลาสว่าสามารถเข้าถึงได้แบบส่วนตัว
  7. ใช้ตัวสร้างคลาสเพื่อเริ่มต้นตัวแปร x ถึง 10
  8. โอเวอร์โหลดความหมายของตัวดำเนินการ ++
  9. ตัวดำเนินการจะเพิ่มค่าของตัวแปร x ด้วย 2
  10. สิ้นสุดส่วนโอเวอร์โหลดของตัวดำเนินการ ตัวดำเนินการได้รับการตั้งชื่อใหม่
  11. การเรียกใช้ฟังก์ชัน Print()
  12. พิมพ์ค่าของตัวแปร x ควบคู่ไปกับข้อความอื่นๆ บนคอนโซลเมื่อมีการเรียกใช้ฟังก์ชัน Print()
  13. ส่วนท้ายของฟังก์ชัน Print()
  14. จุดสิ้นสุดของเนื้อหาชั้นเรียน
  15. เรียกใช้ฟังก์ชัน main() ควรเพิ่มตรรกะของโปรแกรมภายในฟังก์ชันนี้
  16. สร้างอินสแตนซ์ของ Operaคลาส torOverload ชื่อ ov
  17. นี่จะเป็นการเรียกใช้ฟังก์ชันตัวดำเนินการ void ++()
  18. ใช้จุดยืนของ Operaคลาส torOverload เพื่อเรียกใช้ฟังก์ชัน Print()
  19. ฟังก์ชันจะต้องคืนค่าเมื่อดำเนินการเสร็จสิ้น
  20. ส่วนท้ายของฟังก์ชัน 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:

เกินพิกัด Operaตัวอย่างทอร์

นี่คือภาพหน้าจอของรหัส:

เกินพิกัด Operaตัวอย่างทอร์

คำอธิบายรหัส:

  1. รวมไฟล์ส่วนหัว iostream ไว้ในโปรแกรมของเราเพื่อใช้ฟังก์ชันต่างๆ
  2. รวมเนมสเปซมาตรฐานไว้ในโปรแกรมของเราเพื่อใช้คลาสโดยไม่ต้องเรียกมัน
  3. สร้างคลาสชื่อ TestClass { ถือเป็นจุดเริ่มต้นของเนื้อหาคลาส
  4. ใช้ตัวแก้ไขการเข้าถึงส่วนตัวเพื่อทำเครื่องหมายตัวแปรว่าเป็นส่วนตัว ซึ่งหมายความว่าสามารถเข้าถึงได้จากภายในคลาสเท่านั้น
  5. กำหนดตัวแปรจำนวนเต็มสองตัว จริงและมากกว่า
  6. ใช้ตัวแก้ไขการเข้าถึงสาธารณะเพื่อทำเครื่องหมายตัวสร้างให้เป็นสาธารณะ ซึ่งหมายความว่าจะสามารถเข้าถึงได้แม้อยู่นอกคลาส
  7. การสร้างตัวสร้างคลาสและการเริ่มต้นไฟล์ ตัวแปร.
  8. เริ่มต้นค่าของตัวแปรจริง
  9. เริ่มต้นค่าของตัวแปรทับ
  10. จุดสิ้นสุดของตัวสร้าง
  11. แทนที่ความหมายของตัวดำเนินการ +
  12. สร้างผลลัพธ์ประเภทข้อมูลประเภท TestClass
  13. ใช้ตัวดำเนินการ + กับตัวเลขเชิงซ้อน บรรทัดนี้จะเพิ่มส่วนจริงของตัวเลขเข้ากับส่วนจริงของตัวเลขอื่น
  14. ใช้ตัวดำเนินการ + กับตัวเลขเชิงซ้อน บรรทัดนี้จะเพิ่มส่วนจินตภาพของตัวเลขเข้ากับส่วนจินตภาพของตัวเลขอื่น
  15. โปรแกรมจะคืนค่าของผลลัพธ์ของตัวแปรเมื่อดำเนินการสำเร็จ
  16. สิ้นสุดนิยามความหมายใหม่ของตัวดำเนินการ + นั่นคือการโอเวอร์โหลด
  17. เรียกเมธอด print()
  18. พิมพ์ตัวเลขเชิงซ้อนใหม่หลังจากการบวกบนคอนโซล
  19. ส่วนท้ายของฟังก์ชัน print()
  20. ส่วนท้ายของเนื้อหาของคลาส TestClass
  21. การเรียกใช้ฟังก์ชัน main()
  22. ส่งค่าทั้งส่วนจริงและส่วนเชิงซ้อนที่จะบวกกัน โดยส่วนแรกของ c1 จะถูกบวกกับส่วนแรกของ c2 นั่นคือ 9+4 ส่วนที่สองของ c1 จะถูกบวกกับส่วนที่สองของ c นั่นคือ 5+3
  23. ดำเนินการโดยใช้ตัวดำเนินการโอเวอร์โหลด + และเก็บผลลัพธ์ไว้ในตัวแปร c3
  24. การพิมพ์ค่าของตัวแปร c3 บนคอนโซล
  25. ส่วนท้ายของฟังก์ชัน main()

สรุป

  • คุณสามารถระบุความหมายสำหรับ a ได้มากกว่าหนึ่งความหมาย C++ ผู้ประกอบการ ในขอบเขตเดียว
  • สิ่งนี้เรียกว่าการโอเวอร์โหลดตัวดำเนินการ
  • Operaการโอเวอร์โหลด Tor ให้ความหมายพิเศษของตัวดำเนินการสำหรับชนิดข้อมูลที่ผู้ใช้กำหนด
  • คุณสามารถกำหนดใหม่ส่วนใหญ่ของ C++ ผู้ปฏิบัติงานผ่านการโอเวอร์โหลดของผู้ปฏิบัติงาน
  • ไม่ทั้งหมด C++ ผู้ปฏิบัติงานสามารถโอเวอร์โหลดได้
  • หากต้องการให้ตัวดำเนินการโอเวอร์โหลด ตัวดำเนินการอย่างน้อยหนึ่งตัวต้องเป็นอ็อบเจ็กต์ที่ผู้ใช้กำหนด
  • สามารถโอเวอร์โหลดตัวดำเนินการที่มีอยู่ได้เท่านั้น ไม่สามารถโอเวอร์โหลดตัวดำเนินการใหม่ได้