Trong cả ngôn ngữ C và C++ có khá nhiếu các phép toán dùng để thực hiện các thao tác trên các kiểu dữ liệu chuẩn như các phép toán số học +, -, *, / … Vậy việc thực hiện các phép toán này trên các kiểu dữ liệu không chuẩn (các kiểu dữ liệu người dùng định nghĩa) như kiểu mảng hay cấu trúc là nhu cầu cần thiết bắt buộc. ví dụ như muốn tính toán các phép toán số học trên số phức, phân số, đa thức, véc tơ, ma trận… do vậ để đáp ứng được yêu cầu này ta cần phải có cách để định nghĩa chồng các toán tử. Cách định nghĩa chồng toán tử - Tên hàm toán tử: gồm từ khóa operator và tên phép toán operator+ (định nghĩa chồng phép +) operator- (định nghĩa chồng phép -) - Các đối của hàm toán tử: Với phép toán có hai toán hạng: hàm toán tử cần hai đối số (đối 1 ứng với toán hạng 1, đối 2 ứng với toán hạng 2) thứ tự là quan trọng. Với phép toán có một toán hạng: hàm toán tử cần một đối. - Thân của hàm toán tử: Viết như thân của hàm thông thường. - Cách dùng: có hai cách dùng Cách 1: dùng như một hàm thông thường bằng cách viết lời gọi hàm. Cách 2: dùng như phép toán trong C++ Các ví dụ về định nghĩa về chồng toán tử Ví dụ 1: Trong ví dụ này ngoài việc sử dụng các hàm toán tử để thực hiện 4 phép tính trên phân số, còn định nghĩa chồng các phép toán << và >> để xuất và nhập phân số (xem chi tiết trong chương 7). Hàm operator<< có 2 đối kiểu ostream& và PS (Phân số). Hàm trả về giá trị kiểu ostream&. Hàm được khai báo như sau: ostream& operator<< (ostream& os, PS p); Tượng tự hàm operator>> được khai báo như sau: istream& operator>> (istream& is,PS &p); Dưới đây sẽ chỉ ra cách xây dựng và sử dụng các hàm toán tử. Chúng ta cũng sẽ thấy việc sử dụng các hàm toán tử rất tự nhiên, ngắn gọn và tiện lợi. CODE: Select All #include <conio.h>#include <iostream.h>#include <math.h>typedef struct{int a,b;} PS;ostream& operator<< (ostream& os, PS p);istream& operator>> (istream& is,PS &p);int uscln(int x, int y);PS rutgon(PS p);PS operator+(PS p1, PS p2);PS operator-(PS p1, PS p2);PS operator*(PS p1, PS p2);PS operator/(PS p1, PS p2);ostream& operator<< (ostream& os, PS p){os << p.a << '/' << p.b ;return os;}istream& operator>> (istream& is,PS &p){cout << "Nhap tu va mau: " ;is >> p.a >> p.b ;return is;}int uscln(int x, int y){x=abs(x); y=abs(y);if (x*y==0) return 1;while (x!=y)if (x>y) x-=y;else y-=x;return x;}PS rutgon(PS p){PS q;int x;x=uscln(p.a,p.b);q.a = p.a / x ;q.b = p.b / x ;return q;}PS operator+(PS p1, PS p2){PS q;q.a = p1.a*p2.b + p2.a*p1.b;q.b = p1.b * p2.b ;return rutgon(q);}PS operator-(PS p1, PS p2){PS q;q.a = p1.a*p2.b - p2.a*p1.b;q.b = p1.b * p2.b ;return rutgon(q);}PS operator*(PS p1, PS p2){PS q;q.a = p1.a * p2.a ;q.b = p1.b * p2.b ;return rutgon(q);}PS operator/(PS p1, PS p2){PS q;q.a = p1.a * p2.b ;q.b = p1.b * p2.a ;return rutgon(q);}void main(){PS p, q, z, u, v ;PS s;cout <<"\nNhap cac PS p, q, z, u, v:\n " ;cin >> p >> q >> z >> u >> v ;s = (p - q*z) / (u + v) ;cout << "\n Phan so s = " << s;getch();}