You are on page 1of 5

Đa năng hóa toán tử -- hoàn toàn tương tự

Chap 4 : Đa năng hóa toán tử , (comma )

I. Chứng minh nó là toán tử


Trước khi đọc bài này chắc là ko ít người cảm thấy sốc khi nghe điều này. Có người sẽ nghĩ tôi
chém gió, nhưng xin bạn hãy bình tĩnh vì sau khi xem 1 vài source sau bạn sẽ nghĩ lại đấy
C++ Code:
Select All | Show/Hide
1. #include <iostream>
2. using namespace std;
3. #include <conio.h>
4.  
5.  
6. void main()
7. {
8.     int a=(3,5);
9.     double b=(4,6.9);
10.     cout<<a<<" "<<b; //a=5 và b=6.9
11.  
12.     for(int i=0;i<10,NULL;i++) //chả in ra cái gì cả
13.         cout<<"langman";     // trong cái vòng lặp for này
14.  
15.     getch();  
16. }
II. Bản chất của nó
+ nó là 1 toán tử có độ ưu tiên thấp gần nhất nên trong ví dụ ở mục I tôi phải dùng () để gom
nhóm nó lại (cũng nhờ vậy mà trong các biểu thức a+2,b+3 ko sinh ra lỗi vì nó ưu tiên thấp nhất
mà,nên được thự hiện sau cùng)
+ nó là toán tử 2 ngôi
+ giá trị trả về của toán tử này chính là đối tượng thứ 2 
+ thứ tự ưu tiên của nó từ trái sang phải
==> phép đa năng hóa bắt buộc phải trả về
==> phép đa năng hóa bắt buộc phải có 1 tham số nếu là phương thức của lớp
==> phép đa năng hóa bắt buộc phải có 2 tham số nếu là global function 

III. Code đa năng hóa mẫu


C++ Code:
Select All | Show/Hide
1. #include <iostream>
2. using namespace std;
3.  
4. class A
5. {
6. public:
7.         int operator,(A b);
8.         int operator,(double n);
9. };
10.  
11. int operator,(A a,int c)
12. {
13.     return c;
14. }
15.  
16. void main()
17. {
18. }

IV. Chú ý và ngoại lệ


khi nằm trong cặp () của tiêu đề hàm,nguyên mẫu hàm, lời gọi hàm thì , hoàn toàn khác rồi , ko
phải toán tử coma nữa nha
Nguyên bản được gửi bởi langman 
...
Và đây là giải pháp tôi đề ra
C++ Code:
Select All | Show/Hide
1. #include <iostream>
2. using namespace std;
3. #include <conio.h>
4.  
5.  
6. class nguoi
7. {
8. private:
9.     int chieucao;
10.     int cannang;
11. public:
12.     friend istream& operator>>(istream &is,nguoi &a);
13. };
14. istream& operator>>(istream &is,nguoi &a)
15. {
16.     cout<<"Nhap chieu cao va can nang :";
17.     return cin>>a.chieucao>>a.cannang;
18. }
19.  
20. class giaovien:public nguoi
21. {
22. private:
23.     int luongthang;
24. public:
25.     friend istream& operator>>(istream &is,giaovien &a);
26. };
27. istream& operator>>(istream &is,giaovien &a)
28. {
29.     cin>>(nguoi&)a; //
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
<<<<<<<<<<<<<<<<<<<<<<<<
30.     cout<<"Nhap vao luong thang : ";
31.     return cin>>a.luongthang;
32. }
33.  
34. void main()
35. {
36.     giaovien x;
37.     cin>>x;
38.     getch();
39. }
theo mình nên sử dụng is và os trong khi định nghĩa chồng toán tử << và toán tử >>
như sau:
Code:
#include <iostream>
#include <conio.h>
using namespace std;
class nguoi {
private:
int chieucao;
int cannang;
public:
friend istream& operator >> (istream &is, nguoi &a);
friend ostream& operator << (ostream &os, const nguoi &a);
};
istream& operator >> (istream &is, nguoi &a) {
cout << "Nhap chieu cao va can nang: ";
return is >> a.chieucao >> a.cannang;
}
ostream& operator << (ostream &os, const nguoi &a) {
return os << "Nhap chieu cao: " << a.chieucao << endl
<< "Can nang: " << a.cannang << endl;
}

class giaovien: public nguoi {


private:
int luongthang;
public:
friend istream& operator >> (istream &is, giaovien &a);
friend ostream& operator << (ostream &os, const giaovien &a);
};
istream &operator >> (istream &is, giaovien &a) {
is >> (nguoi&) a;
cout << "Nhap vao luong thang: ";
return is >> a.luongthang;
}
ostream& operator << (ostream &os, const giaovien &a) {
return os << (nguoi&) a << "Luong thang: " << a.luongthang << endl;
}
int main() {
giaovien x;
cin >> x;
cout << x;
getch();
}

You might also like