ĐH CÔNG NGHỆ THÔNG TIN
/>
Số tiết lý thuyết: 45 tiết
Số tiết thực hành: 30 tiết
1
/>
Nội dung môn học:
Chương
1: Tổng quan về OOP
Chương 2: Lớp & đối tượng
Chương 3: Hàm và hàm đa năng trong OOP
Chương 4: Đa năng hóa toán tử
Chương 5: Sự kế thừa và tính đa hình
2
/>
Chương
4: Đa năng hoá toán tử
niệm đa năng hóa toán tử
Đa năng hóa toán tử một ngôi (++,--)
Đa năng hóa toán tử hai ngôi (+,-,*,/,…)
Định nghĩa lại phép gán (=)
Đa năng hóa toán tử nhập/xuất (>>,<<)
Khái
3
Chương 4: Đa năng hoá toán tử
Khái
niệm đa năng hóa toán tử
Khái niệm
Ví dụ
Cú pháp
Đặc điểm
/>
Khái niệm:
Là khả năng kết hợp một toán tử đã có (+,,*,/,>,<,..) với một hàm thành viên và dùng nó
với các đối tượng của lớp như là những toán
hạng.
Ví dụ:
void main(){
Phanso a,b,c,d;
c=a.Cong(b);
d=c.Nhan(a.Cong(b))
}
void main(){
Phanso a,b,c,d;
c=a+b;
d=(a+b)*c;
}
Ưu điểm của đa năng hoá toán tử?
Giúp cho chương trình dễ hiểu và dễ truy
tìm lỗi
4
Chương 4: Đa năng hoá toán tử
Khái
niệm đa năng hóa toán tử
Khái niệm
Ví dụ
Cú pháp
Đặc điểm
/>
Cú pháp:
<kiểu dữ liệu trả về> operator@(DS_đối số)
Trong đó: @ là toán tử cần đa năng
Ví dụ:
Cách khai báo trước:
Phanso cong(Phanso)
Cách khai báo đa năng: Phanso operator+(Phanso)
Đặc điểm:
Không được phép thay đổi chức năng cơ
bản,ý nghĩa nguyên thủy của toán tử hoặc
thay đổi thứ tự ưu tiên của chúng.
Các toán tử không thể đa năng hóa:
.
.*
::
?:
sizeof
5
/>
Chương
4: Đa năng hoá toán tử
niệm đa năng hóa toán tử
Đa năng hóa toán tử một ngôi (++,--)
Đa năng hóa toán tử hai ngôi (+,-,*,/,…)
Định nghĩa lại phép gán (=)
Đa năng hóa toán tử nhập/xuất (>>,<<)
Khái
6
Chương 4: Đa năng hoá toán tử
Đa
năng hóa toán tử một ngôi (++,--)
Khái niệm
Đặc điểm
Cú pháp
Ví dụ
/>
Khái niệm:
Toán tử một ngôi là gì?
Đặc điểm:
Các toán tử này được sử dụng theo 2 cách: toán
tử đứng trước (prefix) (++a) hay toán tử đứng
sau (postfix) (a++)
Ví dụ: cho biết kết quả của CT sau
void main(){
int a,b;
a=5;
a++;
cout<
++a;
cout<
}
void main(){
int a,b;
a=5;
b=++a;
cout<
a=5;
b=a++;
cout<
}
7
Chương 4: Đa năng hoá toán tử
Đa
năng hóa toán tử một ngôi (++,--)
Khái niệm
Đặc điểm
Cú pháp
Ví dụ
/>
Cú pháp khai báo trong lớp:
Toán tử đứng trước (prefix):
<Kiểu dữ liệu trả về> operator++()
Toán tử đứng sau (postfix):
<Kiểu dữ liệu trả về> operator++(int)
Tham số int được gọi là tham số
giả (chỉ định toán tử đứng sau)
Định nghĩa bên ngoài lớp:
<Kiểu dữ liệu trả về> <Tên_lớp>::operator++()
{
….
}
Ví dụ:
8
Chương 4: Đa năng hoá toán tử
/>
class Phanso{
private:
int tu,mau;
public:
Phanso(int t=0,int m=1);
Phanso operator++();
Phanso operator++(int);
void xuat();
};
void main(){
Phanso::Phanso(int t,int m){
tu=t; mau=m;
}
Phanso Phanso::operator++(){
tu=tu+mau;
return *this;
}
Phanso Phanso::operator++(int){
Phanso temp=*this;
tu=tu+mau;
return temp;
}
void Phanso::xuat(){
cout<
}
b=++a;
Phanso a(1,2),b;
a++;
// KQ: a=3/2
a.xuat();
++a;
// KQ: a=5/2
a.xuat();
// KQ: a=7/2 và b=7/2
a.xuat();
b.xuat();
b=a++;
// KQ: a=9/2 và b=7/2
a.xuat();
b.xuat();
cout<
system("pause");
}
9
/>
Chương
4: Đa năng hoá toán tử
niệm đa năng hóa toán tử
Đa năng hóa toán tử một ngôi (++,--)
Đa năng hóa toán tử hai ngôi (+,-,*,/,…)
Định nghĩa lại phép gán (=)
Đa năng hóa toán tử nhập/xuất (>>,<<)
Khái
10
Chương 4: Đa năng hoá toán tử
Đa
năng hóa toán tử hai ngôi
Khái niệm
Cú pháp
Ví dụ
/>
Khái niệm:
Toán tử hai ngôi là gì?
Cú pháp:
Cách 1: dùng 1 đối số
<kiểu dữ liệu trả về> operator<Toán tử>(đối số thứ hai)
Cách 2: dùng 2 đối số bằng cách dùng hàm bạn friend
friend <kiểu dữ liệu trả về> operator<Toán tử> ( đối số thứ
nhất,đối số thứ hai)
Ví dụ:
Xây dựng lớp phân số giải quyết các trường hợp sau:
Phanso a(1,2),b(3,2),c;
c=a+b;
c=a+5;
c=5+a;
11
Chương 4: Đa năng hoá toán tử
Cách 1: dùng 1 đối số
class PS{
private:
int tu,mau;
public:
PS(int t=0,int m=1){tu=t;mau=m;}
PS operator+(PS);
};
PS PS:: operator+(PS p){
PS kq;
kq.tu=tu*p.mau+p.tu*mau;
kq.mau=mau*p.mau;
return kq;
}
void main(){
PS a(1,2),b(1,2),c(3,4),d;
d=a+b+c;
}
/>
Cách 2: dùng hàm bạn friend
class PS{
private:
int tu,mau;
public:
PS(int t=0,int m=1){tu=t;mau=m;}
friend PS operator+(PS,PS);
};
PS operator+(PS a,PS b){
PS kq;
kq.tu=a.tu*b.mau+a.tu*b.mau;
kq.mau=a.mau*b.mau;
return kq;
}
void main(){
PS a(1,2),b(1,2),c(3,4),d;
d=a+b+c;
}
12
/>
Chương
4: Đa năng hoá toán tử
niệm đa năng hóa toán tử
Đa năng hóa toán tử một ngôi (++,--)
Đa năng hóa toán tử hai ngôi (+,-,*,/,…)
Định nghĩa lại phép gán (=)
Đa năng hóa toán tử nhập/xuất (>>,<<)
Khái
13
Chương 4: Đa năng hoá toán tử
Định
nghĩa lại phép gán (=)
Khái niệm
Lý do?
Cú pháp
Ví dụ
/>
Khái niệm:
Phép gán “=” là gì?
Lý do:
Định nghĩa lại phép gán “=” để giải quyết các trường hợp sau:
Vấn đề con trỏ Null trong cấp phát động(Buổi 2)
Vấn đề chuyển đổi kiểu (Buổi 2)
Cú pháp:
<Kiểu dữ liệu trả về> operator=(DS_Đối số_nếu có)
Ví dụ:
14
Chương 4: Đa năng hoá toán tử
/>
Vấn đề con trỏ Null trong cấp phát động:
class String{
private:
char *p;
public:
String(char *s=“”){p=strdup(s);}
~String(){delete p;}
};
void main(){
String s1(“Hello”);
String s2;
s2=s1;
s1:p
Hello
}
s2:p
Khi kết thúc chương trình s1 giải phóng
vùng nhớ làm cho s2 trỏ vào vùng nhớ
NULL
Giải quyết:
s1:p
Hello
s2:p
Hello
class String{
private:
char *p;
public:
String(char *s=“”){p=strdup(s);}
String& operator=(const String&);
~String(){delete p;}
};
String& String::operator=(const String &s){
p=strdup(s.p);
return (*this);
}
15
Chương 4: Đa năng hoá toán tử
/>
Vấn đề chuyển đổi kiểu:
class PS{
private:
int tu,mau;
public:
PS(int t=0,int m=1){
tu=t;mau=m;
}
};
void main(){
PS a(1,2);
PS b=3; // Error
}
Khi gặp câu lệnh gán như trên, CT lần
lượt thực hiện các thao tác sau:
Có định nghĩa phép gán “=” tương
ứng hay không?
Hàm khởi tạo chuyển đổi kiểu có
hay không?
Giải quyết:
class PS{
private:
int tu,mau;
public:
PS(int t=0,int m=1){
tu=t;mau=m;
}
PS operator=(int);
};
PS PS::operator=(int t){
return PS(t,1);
}
void main(){
PS a(1,2);
PS b=3;
}
16
/>
Chương
4: Đa năng hoá toán tử
niệm đa năng hóa toán tử
Đa năng hóa toán tử một ngôi (++,--)
Đa năng hóa toán tử hai ngôi (+,-,*,/,…)
Định nghĩa lại phép gán (=)
Đa năng hóa toán tử nhập/xuất (>>,<<)
Khái
17
Chương 4: Đa năng hoá toán tử
Đa
năng hóa toán tử nhập/xuất (>>,<<)
Khái niệm
Cú pháp
Ví dụ
/>
Khái niệm:
Là cách thức để các toán tử nhập/xuất (>>,<<)
có thể thực hiện được trên các đối tượng người
dùng.
Cú pháp:
Đa năng hóa toán tử xuất:<<
friend ostream& operator <<(ostream &,const <tenlop>&)
Đa năng hóa toán tử nhập:>>
friend istream& operator >>(istream &, <tenlop>&)
Ví dụ:
18
Chương 4: Đa năng hoá toán tử
/>
Đa năng hoá toán tử nhập/xuất (>>,<<) cho lớp phân số:
class PS{
private:
int tu,mau;
public:
PS(int t=0,int m=1){tu=t;mau=m;}
friend ostream& operator <<(ostream &,const PS&);
friend istream& operator >>(istream &, PS&);
};
ostream& operator <<(ostream & os,const PS& p){
os<
return os;
}
istream& operator >>(istream & is, PS& p){
cout<< "Nhap tu: ";
is>>p.tu;
cout<< "Nhap mau: ";
is>>p.mau;
return is;
}
void main(){
PS a(1,2);
PS b;
cin>>b;
cout<
}
19
ĐH CÔNG NGHỆ THÔNG TIN
/>
20
ĐH CÔNG NGHỆ THÔNG TIN
/>
21
Bài tập trắc nghiệm
/>
Câu 1: Cho Phát biểu nào sau đây là ĐÚNG trong đa năng
hoá toán tử (operator overloading)
A. Có thể thay đổi kết quả thực hiện của các toán tử trên các kiểu dữ liệu cơ sở
(built-in).
B. Có thể định nghĩa thêm toán tử mới ngoài những toán tử đã có trong C++.
C. Có thể thay đổi số lượng tham số (số ngôi) của các toán tử.
D. Không thể thay đổi độ ưu tiên của các toán tử.
22
Bài tập trắc nghiệm
/>
Câu 2: Toán tử nào có thể được viết lại (overloaded trong C++
A.
B.
C.
D.
= (toán tử gán)
?: (toán tử điều kiện)
sizeof (toán tử xác định kích thước dữ liệu)
:: (toán tử phạm vi)
23
Bài tập trắc nghiệm
/>
Câu 3: Để đa năng hoá toán tử >> dùng để nhập các thông tin
của đối tượng thuộc class Data (ví dụ như: cin>>dataToPrint).
Dòng đầu tiên trong hàm cài đặt toán tử là:
A.
B.
C.
D.
ostream operator>>(ostream &input,const Data &dataToPrint)
ostream operator>>(istream &input,const Data &dataToPrint)
istream &operator>>(istream &input, Data dataToPrint)
istream &operator>>(istream &input, Data &dataToPrint)
24
Bài tập trắc nghiệm
/>
Câu 4: Xét đoạn chương trình khai báo class Data như sau:
class Data{
private: int a;
public:
Data operator --(int);
void Giam(){ a=a-1;}
};
Phần cài đặt toán tử -- nào sau đây là đúng
A Data Data::operator – (int){
Data temp=*this;
Giam();
return *temp;
}
B Data Data::operator – (int){
Giam();
Data temp=*this;
return temp;
}
C Data Data::operator – (int){
Data temp=*this;
Giam();
return temp;
}
D Data Data::operator – (int){
Data temp=*this;
temp.Giam();
return this;
}
25