Xem mẫu
- Chương 7
TÁI ĐỊNH NGHĨA TÁC TỬ
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; Ta cần có cách
public: viết các phép
PhanSo(int=0, int=1){…} toán theo dạng
void InPs() {…}
int LonHon (PhanSo x) { gần gũi hơn
return (tu*x.mau>mau*x.tu);}
PhanSo Cong(PhanSo x) {…}
};
void main() { if ( b > a )
PhanSo a(4,9), b(3,7);
if(b.LonHon(a)) Phan So c = b + a
cout
- Giới thiệu (tt)
• 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.
– 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
- Giới thiệu (tt)
• Các tác tử có thể định nghĩa
– Số học: +, -, *, /, … Tăng giảm: ++, --, +=, *=, …
– So sánh: , >=,
- 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 hoán.
class PhanSo {
int tu,mau;
public:
...
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 ; 6
}
- 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:
...
PhanSo operator + (int);
};
PhanSo PhanSo::operator + (int n)
{ return PhanSo(tu + mau*n, mau);}
void main() { Không thể định nghĩa thêm
PhanSo a(2,5); tác tử bằng hàm thành
PhanSo b = a.operator +(10);
viên
PhanSo c = a + 20 ;
PhanSo d = 20 + a ; // Sai cho trường hợp này
7
}
- 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 { void main() {
float *ds; Stack s1(100);
int soluong, vitri; …
public: Stack s2(20);
... …
void operator=(const Stack& s){ s2 = s1;
soluong = s.soluong; …
vitri = s.vitri; s1 = s2;
delete[] ds; }
ds = new float[soluong];
for(int i=0; i
- 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 { void main(){
char mssv[9]; char* hoten; SinhVien a, b, c;
int namsinh; float diemtb; a.Nhap();
public:
c = b = a; //phép gán
...
SinhVien& operator=(const SinhVien d=a; // hxdsc
SinhVien& a){ }
strcpy(mssv,a.mssv); Phải copy dữ liệu
delete[] hoten;
hoten = strdup(a.hoten);
namsinh = a.namsinh; Xóa vùng nhớ cũ, cấp vùng
diemtb = a.diemtb; nhớ mới và copy dữ liệu
return *this; }
9
};
- 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 ), xuất (
- Tái định nghĩa tác tử xuất – nhập
• class
Ví dụDiem
1 {
int x, y;
public :
…
friend ostream& operator > (istream& is, Diem& p);
};
ostream& operator
- Tái định nghĩa tác tử xuất – nhập
• Ví dụ 2
class SinhVien { #include
char mssv[10], *hoten;
float diemtb;
public : void main() {
… SinhVien ptcang;
friend ostream& operator
nguon tai.lieu . vn