C++ Operator Quá tải với các ví dụ

⚡ Tóm tắt thông minh

Operator quá tải C++ Cho phép bạn định nghĩa lại cách hoạt động của các toán tử tích hợp sẵn như + và == với các lớp và đối tượng của riêng bạn. Ở đây, bạn sẽ tìm hiểu cú pháp, các phương pháp, các toán tử có thể được nạp chồng và các quy tắc cần tuân theo.

  • Những gì nó là: OperaTor overloading định nghĩa lại các toán tử như + cho các lớp riêng của bạn.
  • 🇧🇷 Cú pháp: Hãy định nghĩa một hàm có tên là operator, theo sau là ký hiệu, ví dụ như operator+.
  • 🔀 Phương pháp tiếp cận: Bạn có thể nạp chồng toán tử dưới dạng hàm thành viên hoặc hàm bạn bè.
  • 🚫 Giới hạn: Một số toán tử, chẳng hạn như ::, ., và ?:, không thể được nạp chồng.
  • 🤖 Hỗ trợ từ AI: Các công cụ AI như GitHub Copilot viết các hàm quá tải toán tử ngay lập tức.

C++ Operator quá tải

Là gì Operator quá tải?

Sử dụng quá tải nhà điều hành in C++, bạn có thể chỉ định nhiều hơn một nghĩa cho một toán tử trong một phạm vi. Mục đích của việc nạp chồng toán tử là cung cấp một nghĩa đặc biệt của toán tử cho một kiểu dữ liệu do người dùng xác định.

Với sự trợ giúp của việc quá tải toán tử, bạn có thể xác định lại phần lớn C++ toán tử. Bạn cũng có thể sử dụng quá tải toán tử để thực hiện các thao tác khác nhau bằng một toán tử.

cú pháp

Để quá tải một C++ toán tử, bạn nên định nghĩa một hàm đặc biệt bên trong Class như sau:

class class_name
{
    ... .. ...
    public
       return_type operator symbol (argument(s))
       {
           ... .. ...
       } 
    ... .. ...
};

Đây là lời giải thích cho cú pháp trên:

  • return_type là kiểu trả về của hàm.
  • Tiếp theo, bạn đề cập đến từ khóa toán tử.
  • Ký hiệu biểu thị ký hiệu toán tử bị quá tải. Ví dụ: +, -, <, ++.
  • (Các) đối số có thể được truyền cho hàm toán tử theo cách tương tự như các hàm.

Ví dụ 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;
}

Đầu ra:

 Operator quá tải

Đây là ảnh chụp màn hình của mã:

 Operator quá tải

Code Giải thích:

  1. Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Tạo một lớp có tên TestClass.
  4. Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu thành viên lớp là có thể truy cập riêng tư.
  5. Tạo một biến số nguyên. Biến này sẽ có thể truy cập riêng tư.
  6. Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu thành viên lớp là có thể truy cập riêng tư.
  7. Sử dụng hàm tạo của lớp để khởi tạo biến đếm thành 5.
  8. Quá tải ý nghĩa của toán tử -.
  9. Toán tử sẽ giảm giá trị của biến x đi 1.
  10. Kết thúc phần nạp chồng toán tử. Nhà điều hành đã được đặt một tên mới.
  11. Xác định một hàm có tên là hàm Display().
  12. In giá trị của biến count cùng với văn bản khác trên bảng điều khiển khi hàm Display() được gọi. } đánh dấu sự kết thúc của phần thân hàm Display().
  13. Kết thúc thân lớp.
  14. Gọi hàm main(). Logic chương trình nên được thêm vào trong chức năng này.
  15. Tạo một thể hiện của lớp TestClass và đặt tên cho nó là tc.
  16. Điều này sẽ gọi hàm toán tử void –().
  17. Sử dụng lập trường của Lớp TestClass để gọi hàm Display().
  18. Hàm phải trả về giá trị sau khi hoàn thành thành công.
  19. Kết thúc phần thân của hàm main().

Cách tiếp cận khác nhau để Operator Quá tải trong C++

Bạn có thể thực hiện quá tải toán tử bằng cách triển khai bất kỳ loại hàm nào sau đây:

  1. Chức năng thành viên
  2. Chức năng không phải thành viên
  3. Chức năng bạn bè
  • Hàm nạp chồng toán tử có thể là hàm thành viên khi toán hạng bên trái là đối tượng của Lớp.
  • Khi toán hạng Trái khác nhau, Operachức năng nạp chồng tor phải là chức năng không phải là thành viên.

Bạn có thể biến hàm nạp chồng toán tử thành hàm bạn bè nếu nó cần truy cập vào các thành viên lớp riêng tư và được bảo vệ.

Có thể tất cả C++ Operators có bị quá tải không?

Không có C++ các toán tử không thể bị quá tải.

Chúng bao gồm:

  • :: -Toán tử phân giải phạm vi
  • ?: -toán tử bậc ba.
  • . -bộ chọn thành viên
  • Toán tử sizeof
  • * -bộ chọn con trỏ thành viên

Những điều cần ghi nhớ

  1. Với việc nạp chồng toán tử, bạn có thể xác định lại cách toán tử chỉ hoạt động đối với các kiểu do người dùng xác định (đối tượng, cấu trúc). Bạn không thể sử dụng nó cho các kiểu có sẵn (float, char, int, v.v.).
  2. = và & C++ toán tử được nạp chồng theo mặc định. Ví dụ, bạn có thể sao chép các đối tượng của cùng một Lớp trực tiếp bằng toán tử =.
  3. Operator precedence không thay đổi tính liên kết và thứ tự ưu tiên của toán tử. Tuy nhiên, bạn có thể thay đổi thứ tự đánh giá bằng cách sử dụng dấu ngoặc đơn.
  4. Có bốn toán tử mà bạn không thể quá tải trong C++. Chúng bao gồm toán tử phân giải phạm vi (::), toán tử chọn thành viên (.), chọn thành viên thông qua con trỏ tới toán tử hàm (.*) và toán tử ba ngôi (?:).

Quy tắc cho Operator quá tải

Dưới đây là các quy tắc dành cho Operator quá tải:

  • Để nó hoạt động, ít nhất một toán hạng phải là đối tượng lớp do người dùng định nghĩa.
  • Bạn chỉ có thể quá tải các toán tử hiện có. Bạn không thể quá tải các toán tử mới.
  • Một số toán tử không thể bị quá tải khi sử dụng hàm bạn bè. Tuy nhiên, các toán tử như vậy có thể bị quá tải khi sử dụng hàm thành viên.

Làm thế nào để quá tải Operator

Ví dụ 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;
}

Đầu ra:

Quá tải Operaví dụ về tor

Đây là ảnh chụp màn hình của mã:

Quá tải Operaví dụ về tor

Code Giải thích:

  1. Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std trong chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Tạo một lớp có tên OperatorOverload.
  4. Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu thành viên lớp là có thể truy cập riêng tư.
  5. Tạo một biến số nguyên x. Biến này sẽ có thể truy cập riêng tư.
  6. Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu thành viên lớp là có thể truy cập riêng tư.
  7. Sử dụng hàm tạo của lớp để khởi tạo biến x thành 10.
  8. Quá tải ý nghĩa của toán tử ++.
  9. Toán tử sẽ tăng giá trị của biến x lên 2.
  10. Kết thúc phần nạp chồng toán tử. Nhà điều hành đã được đặt một tên mới.
  11. Gọi hàm Print().
  12. In giá trị của biến x cùng với văn bản khác trên bảng điều khiển khi hàm Print() được gọi.
  13. Phần cuối của hàm Print().
  14. Kết thúc thân lớp.
  15. Gọi hàm main(). Logic chương trình nên được thêm vào trong chức năng này.
  16. Tạo một thể hiện của OperaLớp torOverload có tên ov.
  17. Điều này sẽ gọi hàm void operator ++().
  18. Sử dụng thế đứng của Operalớp torOverload để gọi hàm Print().
  19. Hàm phải trả về giá trị sau khi hoàn thành thành công.
  20. Kết thúc phần thân của hàm main().

Ví dụ 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();
}

Đầu ra:

Quá tải Operaví dụ về tor

Đây là ảnh chụp màn hình của mã:

Quá tải Operaví dụ về tor

Code Giải thích:

  1. Đưa tệp tiêu đề iostream vào chương trình của chúng tôi để sử dụng các chức năng của nó.
  2. Bao gồm không gian tên std vào chương trình của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
  3. Tạo một lớp có tên TestClass. { đánh dấu sự bắt đầu của nội dung lớp.
  4. Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu các biến là riêng tư, nghĩa là chúng chỉ có thể được truy cập từ bên trong Lớp.
  5. Xác định hai biến số nguyên, thực và trên.
  6. Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu hàm tạo là công khai, nghĩa là nó sẽ có thể truy cập được ngay cả bên ngoài Lớp.
  7. Tạo hàm tạo của lớp và khởi tạo biến.
  8. Khởi tạo giá trị của biến real.
  9. Khởi tạo giá trị của biến trên.
  10. Kết thúc phần thân của hàm tạo.
  11. Ghi đè ý nghĩa của toán tử +.
  12. Tạo kết quả kiểu dữ liệu kiểu TestClass.
  13. Sử dụng toán tử + với số phức. Dòng này sẽ thêm phần thực của một số vào phần thực của một số khác.
  14. Sử dụng toán tử + với số phức. Dòng này sẽ thêm phần ảo của một số vào phần ảo của một số khác.
  15. Chương trình sẽ trả về giá trị của biến result khi thực hiện thành công.
  16. Kết thúc định nghĩa về ý nghĩa mới của toán tử +, tức là quá tải.
  17. Gọi phương thức print().
  18. In số phức mới sau khi cộng vào bảng điều khiển.
  19. Kết thúc phần thân của hàm print().
  20. Phần cuối của lớp TestClass.
  21. Gọi hàm main().
  22. Truyền giá trị của cả phần thực và phần phức cần cộng. Phần đầu tiên của c1 sẽ được cộng vào phần đầu tiên của c2, tức là 9+4. Phần thứ hai của c1 sẽ được cộng vào phần thứ hai của c, tức là 5+3.
  23. Thực hiện một thao tác bằng toán tử + được nạp chồng và lưu kết quả vào biến c3.
  24. In giá trị của biến c3 trên bàn điều khiển.
  25. Kết thúc phần thân của hàm main().

Câu Hỏi Thường Gặp

OperaTính năng quá tải toán tử cho phép bạn định nghĩa lại cách các toán tử tích hợp sẵn, chẳng hạn như + hoặc ==, hoạt động với các đối tượng thuộc lớp riêng của bạn, sao cho chúng hoạt động tự nhiên với các kiểu dữ liệu tùy chỉnh.

Hãy định nghĩa một hàm đặc biệt có tên là từ khóa operator theo sau là ký hiệu, ví dụ như operator+. Hàm này nhận các toán hạng làm tham số và trả về kết quả.

Có hai cách tiếp cận chính: nạp chồng toán tử dưới dạng hàm thành viên của lớp, hoặc dưới dạng hàm bạn có thể truy cập các thành viên riêng tư của lớp.

Hầu hết các toán tử đều có thể được nạp chồng, nhưng một số thì không, bao gồm các toán tử phân giải phạm vi (::), truy cập thành viên (.), con trỏ thành viên (.*) và toán tử ba ngôi (?:).

Bạn chỉ có thể nạp chồng các toán tử hiện có, ít nhất một toán hạng phải là kiểu dữ liệu do người dùng định nghĩa, và bạn không thể thay đổi độ ưu tiên, tính kết hợp hoặc số lượng toán hạng của toán tử.

Các trợ lý AI như GitHub Copilot tạo ra các hàm quá tải toán tử cho các lớp của bạn, lựa chọn giữa hàm thành viên và hàm bạn bè, và thêm các kiểu trả về chính xác khi bạn gõ.

Đúng vậy. Các công cụ hỗ trợ bởi trí tuệ nhân tạo tạo ra các toán tử quá tải như + và ==, tuân theo các quy tắc chuẩn và đánh dấu các toán tử không thể quá tải, giúp tiết kiệm thời gian và giảm thiểu lỗi.

OperaViệc nạp chồng toán tử giúp các lớp dễ sử dụng và dễ đọc hơn bằng cách cho phép các đối tượng làm việc với các toán tử quen thuộc, chẳng hạn như cộng hai vectơ bằng toán tử + thay vì một hàm được đặt tên.

Tóm tắt bài viết này với: