Khái niệm đa năng hóa toán tử Cách khai báo trước: Phanso congPhanso Cách khai báo đa năng: Phanso operator +Phanso... Định nghĩa lại phép gán “=” để giải quyết các trường hợp sau: V
Trang 1Số tiết lý thuyết: 45 tiết
Số tiết thực hành: 30 tiết
Trang 2http://sites.google.com/site/khaiphong
Nội dung môn học:
Trang 3 Khái niệm đa năng hóa toán tử
Đ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 (>>,<<)
Chương 4: Đa năng hoá toán tử
Trang 4(+,- Ví dụ:
Ư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
Chương 4: Đa năng hoá toán tử
Trang 5 Khái niệm đa năng hóa toán tử
Cách khai báo trước: Phanso cong(Phanso) Cách khai báo đa năng: Phanso operator +(Phanso)
.* :: ?: sizeof
Trang 6http://sites.google.com/site/khaiphong
Đ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 (>>,<<)
Chương 4: Đa năng hoá toán tử
Trang 7 Đa năng hóa toán tử một ngôi (++, )
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
// a=6, b=6 // a=6, b=5
Trang 8 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 )
Định nghĩa bên ngoài lớp:
<Kiểu dữ liệu trả về> <Tên_lớp>:: operator ++() {
…
}
Ví dụ:
Chương 4: Đa năng hoá toán tử
Tham số int được gọi là tham số giả (chỉ định toán tử đứng sau)
Trang 9// KQ: a=9/2 và b=7/2
Trang 10http://sites.google.com/site/khaiphong
Đ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 (>>,<<)
Chương 4: Đa năng hoá toán tử
Trang 11 Đa năng hóa toán tử hai ngôi
Trang 13 Khái niệm đa năng hóa toán tử
Đ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 (>>,<<)
Chương 4: Đa năng hoá toán tử
Trang 14Đị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)
Trang 15 Vấn đề con trỏ Null trong cấp phát động:
String(char *s=“”){p=strdup(s);}
String& operator=(const String&); ~String(){delete p;}
Trang 16http://sites.google.com/site/khaiphong
Chương 4: Đa năng hoá toán tử
Vấn đề chuyển đổi kiểu:
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ó
// Error
Trang 17 Khái niệm đa năng hóa toán tử
Đ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 (>>,<<)
Chương 4: Đa năng hoá toán tử
Trang 18 Đ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ụ:
Chương 4: Đa năng hoá toán tử
Trang 19 Đa năng hoá toán tử nhập/xuất (>>,<<) cho lớp phân số:
PS(int t=0,int m=1){tu=t;mau=m;}
friend ostream & operator <<( ostream &, const PS&);
friend istream & operator >>( istream &, PS&);
istream & operator >>( istream & is, PS& p){
cout<< "Nhap tu: ";
Trang 20ĐH CÔNG NGHỆ THÔNG TIN http://sites.google.com/site/khaiphong
Trang 22http://sites.google.com/site/khaiphong
Câu 1: Cho Phát biểu nào sau đây là ĐÚNG trong đa năng
hoá toán tử (operator overloading)
Bài tập trắc nghiệm
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ử
Trang 23Câu 2: Toán tử nào có thể được viết lại (overloaded trong C++
A = (toán tử gán)
B ?: (toán tử điều kiện)
C sizeof (toán tử xác định kích thước dữ liệu)
D :: (toán tử phạm vi)
Trang 24http://sites.google.com/site/khaiphong
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à:
Bài tập trắc nghiệm
A ostream operator>>(ostream &input,const Data &dataToPrint)
B ostream operator>>(istream &input,const Data &dataToPrint)
C istream &operator>>(istream &input, Data dataToPrint)
D istream &operator>>(istream &input, Data &dataToPrint)
Trang 25Câ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
B Data Data::operator – (int){
Trang 284 C b= a (trừ trước gán sau) b=a (gán trước trừ sau: tức giá trị b phải bằng giá trị a)
Trang 29ĐÁP ÁN:
6 D Hàm ảo phải là hàm thành viên của lớp
7 A Các khái niệm B,D,C là những khái niệm SAI
8 D Câu lệnh d.BaseA::Print(); đã xác định rõ hàm Print() là của lớp A
9 C pb là con trỏ lớp cơ bản nên có thể trỏ tới đối tượng là lớp dẫn xuất nhưng ngược lại thì không
Derive d;
d là đối tượng lớp dẫn xuất nên trỉnh tự gọi hàm khởi tạo: lớp cơ bản gọi trước, lớp dẫn xuất gọi sau