<< Chapter < Page | Chapter >> Page > |
Để đa năng hóa toán tử<<phải có một toán hạng trái của kiểu ostream&(như là cout trong biểu thức cout<<X), vì thế nó phải là hàm không thành viên. Tương tự, đa năng hóa toán tử>>phải có một toán hạng trái của kiểu istream&(như là cin trong biểu thức cin>>X), vì thế vì thế nó cũng phải là hàm không thành viên.
Ngoại trừ đa năng hóa toán tử>>và<<liên quan đến dòng nhập/xuất dữ liệu chúng ta có hình 4.4 về cách đa năng hóa toán tử như sau:
Biểu thức | Hàm thành viên | Hàm không thành viên |
a#b | a.operator#(b) | operator#(a,b) |
#a | a.operator() | operator#(a) |
a=b | a.operator=(b) | |
a[b] | a.operator[](b) | |
a(b) | a.operator()(b) | |
a-> | a.operator->() | |
a++ | a.operator++(0) | operator++(a,0) |
a-- | a.operator--(0) | operator--(a,0) |
Hình 4.4: Việc cài đặt các hàm toán tử
Các toán tử hai ngôi được đa năng hóa trong hình 4.5 sau:
Toán tử | Ví dụ | Toán tử | Ví dụ | Toán tử | Ví dụ |
+ | a+b | += | a+=b | <<= | a<<=b |
- | a-b | -= | a-=b | == | a==b |
* | a*b | *= | a*=b | != | a!=b |
/ | a/b | /= | a/=b | <= | a<=b |
% | a%b | %= | a%=b | >= | a>=b |
^ | a^b | ^= | a^=b | && | a&&b |
& | a&b | &= | a&=b | || | a||b |
| | a|b | |= | a|=b | , | a,b |
= | a=b | << | a<<b | [] | a[b] |
< | a<b | >> | a>>b | ->* | a->*b |
> | a>b | >>= | a>>=b |
Hình 4.5: Các toán tử hai ngôi được đa năng hóa
Một toán tử hai ngôi có thể được đa năng hóa như là hàm thành viên không tĩnh với một tham số hoặc như một hàm không thành viên với hai tham số (một trong các tham số này phải là hoặc là một đối tượng lớp hoặc là một tham chiếu đến đối tượng lớp).
Ví dụ 4.2: Chúng ta xây dựng lớp số phức với tên lớp là Complex và đa năng hóa các toán tử tính toán + - += -= và các toán tử so sánh == !=>>=<<= với các hàm toán tử là các hàm thành viên.
1: #include<iostream.h>
2: #include<math.h>
3:
4: class Complex
5: {
6: private:
7: double Real, Imaginary;
8: public:
9: Complex(); // Constructor mặc định
10: Complex(double R,double I);
11: Complex (const Complex&Z); // Constructor sao chép
12: Complex (double R); // Constructor chuyển đổi
13: void Print(); // Hiển thị số phức
14: // Các toán tử tính toán
15: Complex operator + (Complex Z);
16: Complex operator - (Complex Z);
17: Complex operator += (Complex Z);
18: Complex operator -= (Complex Z);
19: // Các toán tử so sánh
20: int operator == (Complex Z);
21: int operator != (Complex Z);
22: int operator>(Complex Z);
23: int operator>= (Complex Z);
24: int operator<(Complex Z);
25: int operator<= (Complex Z);
26: private:
27: double Abs(); // Giá trị tuyệt đối của số phức
28: };
29:
30: Complex::Complex()
31: {
32: Real = 0.0;
33: Imaginary = 0.0;
34: }
35:
36: Complex::Complex(double R,double I)
37: {
38: Real = R;
39: Imaginary = I;
40: }
41:
42: Complex::Complex(const Complex&Z)
43: {
44: Real = Z.Real;
45: Imaginary = Z.Imaginary;
46: }
47:
48: Complex::Complex(double R)
49: {
50: Real = R;
51: Imaginary = 0.0;
52: }
53:
54: void Complex::Print()
55: {
56: cout<<'('<<Real<<','<<Imaginary<<')';
57: }
58:
59: Complex Complex::operator + (Complex Z)
60: {
61: Complex Tmp;
62
63: Tmp.Real = Real + Z.Real;
64: Tmp.Imaginary = Imaginary + Z.Imaginary;
65: return Tmp;
66: }
67:
68: Complex Complex::operator - (Complex Z)
69: {
70: Complex Tmp;
71:
72: Tmp.Real = Real - Z.Real;
73: Tmp.Imaginary = Imaginary - Z.Imaginary;
74: return Tmp;
75: }
76:
77: Complex Complex::operator += (Complex Z)
Notification Switch
Would you like to follow the 'Lập trình hướng đối tượng' conversation and receive update notifications?