Nạp Chồng Toán Tử (operator Overloading) Trong C++ - Góc Học IT
Có thể bạn quan tâm
1. Nạp chồng toán tử (operator overloading) là gì?
Nạp chồng toán tử trong C++ là các hàm có tên đặc biệt. Tên hàm gồm từ khóa operator và theo sau là ký hiệu của toán tử đang được định nghĩa.
Nạp chồng toán tử được dùng để định nghĩa lại các toán tử có sẵn như ++, – -, +, -, *, /,… cho kiểu dữ liệu (class) do người lập trình tự định nghĩa. Nhằm tạo ra toán tử cùng tên nhưng thực hiện trên các lớp khác nhau chứ không phải trên các kiểu dữ liệu nguyên thủy.
Để dễ hiểu, các bạn xem ví dụ cộng (+) 2 đối tượng phân số bên dưới. Khi cộng (+) sẽ bị lỗi, bởi vì chưa có định nghĩa toán tử cộng (+) cho đối tượng phân số.#include <iostream> using namespace std; class Phanso{ private: int tuso;//tử số của phân số int mauso;//mẫu số của phân số public: Phanso(){ tuso = 0; mauso = 1; } Phanso(int tuso, int mauso){ this->tuso = tuso; this->mauso = mauso; } int getTuso(){ return tuso; } int getMauso(){ return mauso; } int setTuso(int tuso){ this->tuso = tuso; } int setMauso(int mauso){ this->mauso = mauso; } }; void main() { Phanso ps1(5, 9); Phanso ps2(7, 10); Phanso ps3; ps3 = ps1 + ps2;//lỗi toán tử + chưa định nghĩa system("pause"); }
Kết quả lỗi
no operator "+" matches these operandsLưu ý: Ví dụ có khai báo int x=0, y=1; int tong = x + y; không bị lỗi bởi C++ đã định nghĩa sẵn toán tử cộng (+) cho các biến kiểu int rồi.
Cú pháp định nghĩa một toán tử nạp chồng:Kiểu_trả_về operator <toán tử> (danh_sách_đối_số){ //Định nghĩa toán tử }
Trong đó:– Kiểu_trả_về là kiểu dữ liệu của hàm nạp chồng toán tử.
– <toán tử> là tên toán tử cần nạp chồng (+, -, *, /,…)
– operator <toán tử> <danh_sách_đối_số) gọi là hàm nạp chồng toán tử. Nó có thể là hàm thành phần hoặc là hàm bạn của lớp (class) nhưng không thể là hàm tĩnh.
Ví dụ:
Diem operator++();//Toán tử ++: toán tử 1 ngôi PhanSo operator+(PhanSo ps);//Toán tử +: toán tử 2 ngôiNếu hàm nạp chồng toán tử là hàm bạn (friend function) thì có một đối số cho toán tử một ngôi và hai đối số cho toán tử hai ngôi.friend PhanSo operator++(PhanSo b); friend PhanSo operator+(PhanSo a, PhanSo b);
Toán tử một ngôi là toán tử chỉ có một toán hạng. Ví dụ: x++, toán tử ++ chỉ có một toán hạng là x. Toán tử hai ngôi là toán tử có hai toán hạng. Ví dụ: a + b, toán tử + phải có đủ 2 số a và b thì mới cộng (+) được.
Trong C++, ta có thể nạp chồng cho hầu hết các toán tử:+ – * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ – – ->* , -> [] () new new[] delete delete[]
Nhưng ngoại trừ những toán tử sau đây:
- Toán tử xác định thành phần của lớp (‘.’, ‘->’).
- Toán tử phân giải miền xác định (‘::’).Toán tử điều kiện (‘? :’).
- Toán tử lấy kích thước (‘sizeof’).
- Toán tử lấy kiểu dữ liệu (‘typeid’)
Lưu ý: Không thể thay đổi các toán tử đã định nghĩa trước trong C++. Ví dụ, không thể định nghĩa lại các phép toán +, -, *, /,… đối với các số kiểu int, float.
2. Nạp chồng toán tử một ngôi
Các toán tử một ngôi là các toán tử chỉ có một toán hạng tham gia vào phép toán, như toán tử tăng (++) và toán tử giảm (- -).#include <iostream> using namespace std; class Counter{ private: int count; public: Counter(){ count=0; } int getCount(){ return count; } Counter operator ++(){//hàm nạp chồng toán tử count = count + 1; Counter temp; temp.count = count; return temp; } }; void main() { Counter c1, c2; cout << "count of c1 = " << c1.getCount(); cout << "\ncount of c2 = " << c2.getCount() << endl; ++c1; c2 = ++c1; cout << "count of c1 = " << c1.getCount(); cout << "\ncount of c2 = " << c2.getCount() << endl; system("pause"); }
Kết quả
count of c1 = 0 count of c2 = 0 count of c1 = 2 count of c2 = 23. Nạp chồng toán tử hai ngôi
Các toán tử hai ngôi có hai toán hạng như toán tử cộng (+), toán tử trừ (-), toán tử nhân (*), toán tử chia (/),…#include <iostream> using namespace std; class Distance{ private: int feet; float inches; public: Distance(){ feet = 0; inches = 0; } Distance(int ft, float in){ feet = ft; inches = in; } void getdist(){ cout << "Enter feet : "; cin >> feet; cout << "Enter inches : "; cin >> inches; } void showdist(){ cout << feet << "\' - " << inches << '\"'; } Distance operator + (Distance d2){//hàm nạp chồng toán tử int f = feet + d2.feet; float i = inches + d2.inches; if (i >= 12.0){ i -= 12.0; f++; } return Distance(f, i); } }; void main() { Distance dist1, dist3, dist4; dist1.getdist(); Distance dist2(11, 6.25); dist3 = dist1 + dist2; dist4 = dist1 + dist2 + dist3; //display all lengths cout << "dist1 = "; dist1.showdist(); cout << endl; cout << "dist2 = "; dist2.showdist(); cout << endl; cout << "dist3 = "; dist3.showdist(); cout << endl; cout << "dist4 = "; dist4.showdist(); cout << endl; system("pause"); }
Kết quả
Enter feet : 5 Enter inches : 3 dist1 = 5' - 3" dist2 = 11' - 6.25" dist3 = 16' - 9.25" dist4 = 33' - 6.5"Các bạn hãy thử viết hàm nạp chồng các toán tử khác như -, *, /, %,…
- Cú pháp và cách sử dụng toán tử điều kiện trong C++
- Một số kỹ thuật lập trình với kiểu dữ liệu cấu trúc (struct) trong C++
- Các thao tác trên cây nhị phân tìm kiếm (Binary Search Tree)
- Thuật toán sắp xếp chọn trực tiếp (Selection Sort)
- Hướng dẫn cài đặt và sử dụng Arduino IDE
Từ khóa » Toán Tử Là Gì Cho Ví Dụ
-
Toán Tử (lập Trình Máy Tính) – Wikipedia Tiếng Việt
-
Toán Tử – Wikipedia Tiếng Việt
-
Toán Tử Trong C++, Khái Niệm Và Ví Dụ Minh Họa - Thủ Thuật
-
Toán Tử - Wiki Là Gì
-
Học C++/toán Tử - Có Nghĩa Là Gì, Ý Nghĩa La Gi 2021
-
Toán Tử Trong C - AICurious
-
Toán Tử Tính Toán Và ưu Tiên - Microsoft Support
-
Bảng Toán Tử - Microsoft Support
-
Review Toán Tử Là Gì? Các Toán Tử Trong C, C++ Thường Gặp
-
Toán Tử Là Gì? Các Toán Tử Trong C, C++ Thường Gặp - HappyMobile.Vn
-
Ý Nghĩa Của Các Toán Tử
-
Toán Tử Trong C++
-
Toán Tử Trong C++, Khái Niệm Và Ví Dụ Minh Họa
-
Các Toán Tử Trong PHP
-
Các Toán Tử Trong Tính Toán Và Mức độ ưu Tiên Trong Excel Cực Chi Tiết
-
Toán Tử 2 Ngôi Là Gì
-
[PDF] Nạp Chồng Toán Tử, Từ Khóa Friend Và Tham Chiếu - VNU-UET
-
Toán Tử (operators) Và Biểu Thức (expressions)