C++ Operator Quá tải với các ví dụ
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:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- 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ó.
- 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ó.
- Tạo một lớp có tên TestClass.
- 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ư.
- Tạo một biến số nguyên. Biến này sẽ có thể truy cập riêng tư.
- 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ư.
- Sử dụng hàm tạo của lớp để khởi tạo biến đếm thành 5.
- Quá tải ý nghĩa của toán tử -.
- Toán tử sẽ giảm giá trị của biến x đi 1.
- 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.
- Xác định một hàm có tên là hàm Display().
- 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().
- Kết thúc thân lớp.
- Gọi hàm main(). Logic chương trình nên được thêm vào trong chức năng này.
- Tạo một thể hiện của lớp TestClass và đặt tên cho nó là tc.
- Điều này sẽ gọi hàm toán tử void –().
- Sử dụng lập trường của Lớp TestClass để gọi hàm Display().
- Hàm phải trả về giá trị sau khi hoàn thành thành công.
- 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:
- Chức năng thành viên
- Chức năng không phải thành viên
- 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ớ
- 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.).
- = 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ử =.
- 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.
- 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:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- 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ó.
- 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ó.
- Tạo một lớp có tên OperatorOverload.
- 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ư.
- Tạo một biến số nguyên x. Biến này sẽ có thể truy cập riêng tư.
- 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ư.
- Sử dụng hàm tạo của lớp để khởi tạo biến x thành 10.
- Quá tải ý nghĩa của toán tử ++.
- Toán tử sẽ tăng giá trị của biến x lên 2.
- 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.
- Gọi hàm Print().
- 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.
- Phần cuối của hàm Print().
- Kết thúc thân lớp.
- Gọi hàm main(). Logic chương trình nên được thêm vào trong chức năng này.
- Tạo một thể hiện của OperaLớp torOverload có tên ov.
- Điều này sẽ gọi hàm void operator ++().
- Sử dụng thế đứng của Operalớp torOverload để gọi hàm Print().
- Hàm phải trả về giá trị sau khi hoàn thành thành công.
- 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:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Đư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ó.
- 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ó.
- Tạo một lớp có tên TestClass. { đánh dấu sự bắt đầu của nội dung lớp.
- 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.
- Xác định hai biến số nguyên, thực và trên.
- 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.
- Tạo hàm tạo của lớp và khởi tạo biến.
- Khởi tạo giá trị của biến real.
- Khởi tạo giá trị của biến trên.
- Kết thúc phần thân của hàm tạo.
- Ghi đè ý nghĩa của toán tử +.
- Tạo kết quả kiểu dữ liệu kiểu TestClass.
- 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.
- 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.
- Chương trình sẽ trả về giá trị của biến result khi thực hiện thành công.
- Kết thúc định nghĩa về ý nghĩa mới của toán tử +, tức là quá tải.
- Gọi phương thức print().
- In số phức mới sau khi cộng vào bảng điều khiển.
- Kết thúc phần thân của hàm print().
- Phần cuối của lớp TestClass.
- Gọi hàm main().
- 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.
- 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.
- In giá trị của biến c3 trên bàn điều khiển.
- Kết thúc phần thân của hàm main().
Tổng kết
- Bạn có thể chỉ định nhiều hơn một ý nghĩa cho một C++ nhà điều hành trong một phạm vi.
- Điều này được gọi là quá tải toán tử.
- OperaQuá tải tor cung cấp một ý nghĩa đặc biệt của toán tử cho kiểu dữ liệu do người dùng định nghĩa.
- Bạn có thể xác định lại phần lớn C++ toán tử thông qua việc quá tải toán tử.
- Không phải tất cả C++ các toán tử có thể bị quá tải.
- Để một toán tử bị quá tải, ít nhất một trong các toán hạng phải là đối tượng do người dùng xác định.
- Chỉ các toán tử hiện có mới có thể bị quá tải. Bạn không thể quá tải các toán tử mới.