Tài liệu Lập trình hướng đối tượng & C++ - Chương 7: Tái định nghĩa tác tử: TÁI ðỊNH NGHĨA TÁC TỬ
Chương 7
1
Nội dung
• Giới thiệu
• Tỏi ủịnh nghĩa bằng hàm ủộc lập
• Tỏi ủịnh nghĩa bằng hàm thành viờn
• Tỏi ủịnh nghĩa phộp gỏn (dấu =)
• Tỏi ủịnh nghĩa tỏc tử xuất – nhập
2
Giới thiệu • Tại sao cần tỏi ủịnh nghĩa tỏc tử?
class PhanSo {
int tu, mau;
public:
PhanSo(int=0, int=1){}
void InPs() {}
int LonHon (PhanSo x) {
return (tu*x.mau>mau*x.tu);}
Ta cần cú cỏch
viết cỏc phộp
toỏn theo dạng
gần gũi hơn
3
PhanSo Cong(PhanSo x) {}
};
void main() {
PhanSo a(4,9), b(3,7);
if(b.LonHon(a))
cout<<“PS b lon hon a”;
PhanSo c = b.Cong(a);
a.InPs(); cout<< “ + ”; b.InPs();
cout<< “ = ”; c.InPs();
}
if ( b > a )
Phan So c = b + a
cout << a << “ + ”
<< b << “ = ” << c;
• Cơ chế
– C++ cho phộp ta tỏi ủịnh nghĩa cỏc tỏc tử (phộp
toỏn).
– Việc tỏi ủịnh nghĩa tỏc tử thực hiện tương tự như
tỏi ủịnh nghĩa hàm.
Giới thiệu (tt)
– Cỳ phỏp:
operator ( cỏc ủối số )
– Cú 2 cỏch dựng ủể...
3 trang |
Chia sẻ: putihuynh11 | Lượt xem: 673 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng & C++ - Chương 7: Tái định nghĩa tác tử, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TÁI ðỊNH NGHĨA TÁC TỬ
Chương 7
1
Nội dung
• Giới thiệu
• Tái định nghĩa bằng hàm độc lập
• Tái định nghĩa bằng hàm thành viên
• Tái định nghĩa phép gán (dấu =)
• Tái định nghĩa tác tử xuất – nhập
2
Giới thiệu • Tại sao cần tái định nghĩa tác tử?
class PhanSo {
int tu, mau;
public:
PhanSo(int=0, int=1){}
void InPs() {}
int LonHon (PhanSo x) {
return (tu*x.mau>mau*x.tu);}
Ta cần cĩ cách
viết các phép
tốn theo dạng
gần gũi hơn
3
PhanSo Cong(PhanSo x) {}
};
void main() {
PhanSo a(4,9), b(3,7);
if(b.LonHon(a))
cout<<“PS b lon hon a”;
PhanSo c = b.Cong(a);
a.InPs(); cout<< “ + ”; b.InPs();
cout<< “ = ”; c.InPs();
}
if ( b > a )
Phan So c = b + a
cout << a << “ + ”
<< b << “ = ” << c;
• Cơ chế
– C++ cho phép ta tái định nghĩa các tác tử (phép
tốn).
– Việc tái định nghĩa tác tử thực hiện tương tự như
tái định nghĩa hàm.
Giới thiệu (tt)
– Cú pháp:
operator ( các đối số )
– Cĩ 2 cách dùng để tái định nghĩa tác tử:
• Dùng hàm độc lập
• Dùng hàm thành viên
4
• Các tác tử cĩ thể định nghĩa
– Số học: +, -, *, /, Tăng giảm: ++, --, +=, *=,
– So sánh: , >=, <=, ==, !=
– Phép gán: =
Giới thiệu (tt)
– >, [], new, delete,
5
Tái định nghĩa bằng hàm độc lập
• Thơng thường nên khai báo hàm độc lập là hàm bạn của
lớp để cĩ thể truy cập các thành phần private của lớp.
• Tác tử sau khi định nghĩa khơng cĩ tính giao hốn.
class PhanSo {
int tu,mau;
public:
6
...
friend PhanSo operator + (PhanSo,int);
};
PhanSo operator + (PhanSo x, int n)
{ return PhanSo(x.tu + x.mau*n, x.mau);}
void main() {
PhanSo a(2,5);
PhanSo b = operator +(a,10);
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai
}
Phải định nghĩa thêm tác tử:
PhanSo operator + (int , PhanSo);
Tái định nghĩa bằng hàm thành viên
• ðối số đầu tiên của tác tử chính là đối tượng đang xét.
=> Hàm sẽ cĩ số lượng đối số ít hơn so với hàm độc lập.
class PhanSo {
int tu,mau;
public:
7
...
PhanSo operator + (int);
};
PhanSo PhanSo::operator + (int n)
{ return PhanSo(tu + mau*n, mau);}
void main() {
PhanSo a(2,5);
PhanSo b = a.operator +(10);
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai
}
Khơng thể định nghĩa thêm
tác tử bằng hàm thành viên
cho trường hợp này
Tái định nghĩa phép gán (dấu =)
• C++ mặc nhiên sẽ cĩ phép gán (dấu = ) bằng cách gán tương
ứng từng thuộc tính giữa 2 đối tượng.
• Khi thành phần dữ liệu cĩ con trỏ => phải định nghĩa “=”.
• Phép gán phải định nghĩa bằng hàm thành viên.
class Stack {
float *ds;
void main() {
Stack s1(100);
8
int soluong, vitri;
public:
...
void operator=(const Stack& s){
soluong = s.soluong;
vitri = s.vitri;
delete[] ds;
ds = new float[soluong];
for(int i=0; i<vitri; i++)
ds[i]= s.ds[i]; }
};
Stack s2(20);
s2 = s1;
s1 = s2;
}
Tái định nghĩa phép gán (dấu =)
• Phân biệt giữa phép gán và hàm xây dựng sao chép:
– Phép gán: đối tượng đã tồn tại (cĩ vùng nhớ)
– Hàm xây dựng sao chép: đối tượng chưa cĩ
• Trị trả về của phép gán cĩ thể là chính đối tượng đĩ.
class SinhVien {
char mssv[9]; char* hoten;
void main(){
SinhVien a, b, c;
9
int namsinh; float diemtb;
public:
...
SinhVien& operator=(const
SinhVien& a){
strcpy(mssv,a.mssv);
delete[] hoten;
hoten = strdup(a.hoten);
namsinh = a.namsinh;
diemtb = a.diemtb;
return *this; }
};
Phải copy dữ liệu
Xĩa vùng nhớ cũ, cấp vùng
nhớ mới và copy dữ liệu
a.Nhap();
c = b = a; //phép gán
SinhVien d=a; // hxdsc
}
Tái định nghĩa tác tử xuất – nhập
• Dùng để xuất nhập trực tiếp đối tượng qua cin, cout:
VD: PhanSo a(2,5); cout << a << endl;
• Các phép tốn nhập (>>), xuất (<<) phải được định nghĩa theo
dạng hàm đc lp và thường khai báo là friend.
• Thao tác với các dịng (stream) xuất/nhập chuẩn như:
– Bàn phím, tập tin dùng để đọc, (istream)
– Màn hình, tập tin dùng để ghi, (ostream)
10
class PhanSo {
int tu, mau;
public :
friend ostream& operator << (ostream& os, PhanSo p);
friend istream& operator >> (istream& is, PhanSo& p);
};
Tái định nghĩa tác tử xuất – nhập
• Ví dụ 1class Diem {
int x, y;
public :
friend ostream& operator << (ostream& os, Diem p);
friend istream& operator >> (istream& is, Diem& p);
};
ostream& operator << (ostream& os, Diem p)
11
{ os << “(” << p.x << “,” << p.y <<“)”; return os; }
istream& operator >> (istream& is, Diem& p) {
cout > p.x;
cout > p.y;
return is;}
void main() {
Diem a(2,10), b;
cout<< “Gia tri diem A la: ” << a <<endl;
cout>b;
cout<< “Gia tri diem B la: ” << b <<endl;}
Tái định nghĩa tác tử xuất – nhập
• Ví dụ 2
class SinhVien {
char mssv[10], *hoten;
float diemtb;
public :
friend ostream& operator <<
(ostream& os, SinhVien s) {
void main() {
SinhVien ptcang;
cout<<“Nhap thong tin: ”;
cin >> ptcang;
#include
12
os<<s.mssv<<endl;
os<<s.hoten<<endl;
os<< s.diemtb<<endl;
return os; }
friend istream& operator >>
(istream& is, SinhVien& s){
is.getline(s.mssv,9);
is.getline(s.hoten,49);
is >> s.diemtb;
return is; }
};
cout << “Sinh vien A: ”;
cout << ptcang ;
ofstream f1(“MyFile.txt”);
f1<<ptcang;
f1.close();
ifstream f2(“MyFile.txt”);
SinhVien a1;
f2>>a1;
cout << “Trong file: ”;
cout <<a1;
f2.close();}
Các file đính kèm theo tài liệu này:
- chapter7_6677_1993468.pdf