Bài giảng Nhập môn về lập trình - Bài 8: Nạp chồng toán tử, Từ khóa friend và Tham chiếu - Hoàng Thị Điệp

Bài 8: Nạp chồng toán tử,  
Từ khóa friend và Tham chiếu  
Giảng viên: Hoàng Thị Điệp  
Khoa Cô ng nghệ Thô ng tin – ĐH Cô ng Nghệ  
Chapter 8  
Operator  
Overloading,  
Friends,  
and References  
Copyright © 2010 Pearson Addison-Wesley.  
All rights reserved  
Mục tiêu bài học  
• Căn bản về nạp chồng toán tử  
– Toá n tử một ngôi  
– Nạp chồng dưới dạng hàm thành viên  
• Từ khóa friend và chuyển đổi kiểu tự động  
– Hàm friend, lớp friend  
– Hàm kiến tạo và chuyển đổi kiểu tự động  
• Tham chiếu và bàn thêm về nạp chồng  
– << và >>  
– Cá c toá n tử: = , [], ++, --  
DTH  
INT2202  
Giới thiệu về nạp chồng toán tử  
• Cá c toá n tử +, -, %, ==, v.v.  
– thực ra là các hàm!  
• Đơn giản là chúng được “gọi” bằng cú pháp khác:  
x + 7  
– “+” là toá n tử 2 ngôi với toán hạng là x và 7  
– Con người “thích” kí hiệu này hơn  
• Hã y nghĩ về nó như là:  
+(x, 7)  
– “+” là tên hàm  
– x, 7 là đối số  
– Hàm “+” trả về “tổng” của các đối số của nó  
DTH  
INT2202  
Nạp chồng toán tử  
• Cá c toá n tử có sẵn  
– Ví dụ: +, -, = , %, ==, /, *  
– Đã làm việc với các kiểu có sẵn của C++  
– Với kí hiệu “hai ngôi” chuẩn  
• Ta có thể nạp chồng chúng  
– Để làm việc với kiểu dữ liệu của ta!  
– Để cộng “các biến Chair” hoặc “các biến Money”  
• Phù hợp với nhu cầu của ta  
• Theo “kí hiệu” mà ta quen dùng  
• Hã y nạp chồng bằng “công việc” tương tự!  
DTH  
INT2202  
Căn bản về nạp chồng  
• Nạp chồng toán tử  
– Có nhiều điểm tương tự với nạp chồng hàm  
– Toá n tử chính là tên của hàm  
• Ví dụ: khai báo  
const Money operator +(  
const Money& amount1,  
const Money& amount2);  
– Nạp chồng phép + cho 2 toán hạng kiểu Money  
– Sử dụng tham số tham chiếu hằng cho hiệu quả  
– Giá trị trả về có kiểu Money  
• Cho phé p cộng các đối tượng "Money”  
DTH  
INT2202  
Phép “+” đã được nạp chồng  
• Từ ví dụ vừa rồi:  
– Lưu ý: phé p cộng nạp chồng không phải là hàm thành viên  
– Định nghĩa trong Display 8.1 làm nhiều việc hơn phép cộng đơn  
thuần  
• Phần bắt buộc: xử lý việc cộng 2 đối tượng Money  
• Xử lý các giá trị âm/dương  
• Định nghĩa nạp chồng toán tử nhìn chung là đơn giản  
– Chỉ cần thực hiện “phép cộng” cho kiểu “của bạn”  
DTH  
INT2202  
Định nghĩa “+” cho Money  
Display 8.1 Nạp chồng toá n tử  
• Định nghĩa phép “+” cho lớp Money  
DTH  
INT2202  
Phé p “==“ nạp chồng  
• Phé p so sá nh bằng, ==  
– Cho phép so sánh các đối tượng Money  
– Khai bá o:  
bool operator ==( const Money& amount1,  
const Money& amount2);  
• Trả về kiểu bool cho đẳng thức đúng/sai  
– Đây cũng không phải là một hàm thành viên  
(giống như phép “+” nạp chồng)  
DTH  
INT2202  
Phé p “==“ nạp chồng cho lớp Money:  
Display 8.1 Nạp chồng toá n tử  
• Định nghĩa phép “==“ cho lớp Money:  
DTH  
INT2202  
Hàm kiến tạo trả về đối tượng  
• Hàm kiến tạo là hàm kiểu void?  
– Ta “nghĩ” như vậy nhưng không phải  
– Nó là một hàm “đặc biệt”  
• Với các tính chất đặc biệt  
• CÓ THỂ trả về một giá trị!  
• Nhắc lại: câu lệnh return trong phé p “+” nạp chồng của  
kiểu Money:  
– return Money(finalDollars, finalCents);  
• Trả về một “lời gọi” tới lớp Money!  
• Suy ra hàm kiến tạo thực ra “có trả về” một đối tượng!  
• Gọi là “đối tượng vô danh”  
DTH  
INT2202  
Trả về giá trị const  
• Ta l ại xét việc nạp chồng phép “+”:  
const Money operator +(  
const Money& amount1,  
const Money& amount2);  
– Trả về một “đối tượng hằng”?  
– Vì sao?  
• Để hiểu được lý do, hãy xét ảnh hưởng của việc trả về  
đối tượng không chỉ định là const…  
DTH  
INT2202  
Trả về một giá trị không chỉ định là const  
• Hã y xem xé t khai bá o khô ng chỉ định trả về const:  
Money operator +(  
const Money& amount1,  
const Money& amount2);  
• Xé t biểu thức gọi tới nó:  
m1 + m2  
– Trong đó m1 & m2 là các đối tượng Money  
– Đối tượng trả về có kiểu Money  
– Ta có thể “thao tác trên” đối tượng trả về!  
• Ví dụ như gọi tới hàm thành viên…  
DTH  
INT2202  
Thao tá c trên  
đối tượng không chỉ định const  
• Có thể gọi các hàm thành viên:  
– Ta có thể gọi tới hàm thành viên trên đối tượng trả về bởi biểu  
thức m1+m2:  
• (m1+m2).output();  
// Hợp lệ?  
– Đây không phải là vấn đề vì nó chẳng làm biến đổi giá trị vừa trả về  
• (m1+m2).input();  
// Hợp lệ!  
– Đây là vấn đề! Hợp lệ nhưng biến đổi đổi giá trị vừa trả về!  
• Có thể biến đổi đối tượng “vô danh”!  
• Không cho phép điều đó ở đây!  
• Vì vậy ta định nghĩa đối tượng trả về là const  
DTH  
INT2202  
Nạp chồng toán tử một ngôi  
• C++ có toá n tử một ngôi:  
– Là toá n tử nhận một toán hạng  
– Ví dụ: phép phủ định -  
• x = -y;  
// Đặt x bằng âm y  
– Toá n tử một ngôi khác:  
• ++, --  
• Toá n tử một ngôi cũng có thể bị nạp chồng  
DTH  
INT2202  
Nạp chồng phép phủ định “-“ cho kiểu  
Money  
• Khai bá o hàm “-“ nạp chồng  
– Đặt ngoài định nghĩa lớp:  
const Money operator –(const Money& amount);  
– Chú ý là chỉ có một đối số  
• Vì phé p toá n một ngôi chỉ có 1 toán hạng  
• Phé p “-” bị nạp chồng 2 lần!  
– Cho 2 toá n hạng/đối số (hai ngôi)  
– Cho 1 toá n hạng/đối số (một ngôi)  
– Phải cung cấp cả 2 định nghĩa  
DTH  
INT2202  
Định nghĩa nạp chồng “-”  
• Định nghĩa hàm “-” nạp chồng  
const Money operator –(const Money& amount)  
{
return Money( -amount.getDollars(),  
-amount.getCents());  
}
• Á p dụng toán tử một ngôi “-” cho kiểu có sẵn  
– Phép toán này là “đã biết” với những kiểu có sẵn  
• Trả về đối tượng vô danh  
DTH  
INT2202  
Sử dụng phép “-” nạp chồng  
• Xé t:  
Money  
amount1(10),  
amount2(6),  
amount3;  
amount3 = amount1 – amount2;  
• Sẽ gọi tới phép “-” nạp chồng hai ngôi  
amount3.output(); // Hiển thị $4.00  
amount3 = -amount1;  
• Sẽ gọi tới phép “-” nạp chồng một ngôi  
amount3.output(); // Hiển thị -$10.00  
DTH  
INT2202  
Nạp chồng dưới dạng hàm thành viên  
• Ví dụ trước: các hàm nạp chồng toán tử đứng độc lập  
– Định nghĩa bên ngoài lớp  
• Có thể nạp chồng dưới dạng “toán tử thành viên”  
– Được xem như “hàm thành viên” như các hàm khác  
• Khi toá n tử là hàm thành viên:  
– Toá n tử hai ngôi chỉ cần một tham số, không phải 2!  
– Đối tượng gọi giữ vai trò tham số thứ nhất  
DTH  
INT2202  
Hoạt động của toán tử thành viên  
• Money cost(1, 50), tax(0, 15), total;  
total = cost + tax;  
– Nếu “+” được nạp chồng như toán tử thành viên:  
• Biến/đối tượng cost là đối tượng gọi  
• Đối tượng tax là đối số  
– Hã y nghĩ là: total = cost.+(tax);  
• Khai báo “+” trong định nghĩa lớp:  
– const Money operator +(const Money& amount);  
– Lưu ý là nó chỉ có một đối số  
DTH  
INT2202  
Tải về để xem bản đầy đủ
pdf 48 trang myanh 23320 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Nhập môn về lập trình - Bài 8: Nạp chồng toán tử, Từ khóa friend và Tham chiếu - Hoàng Thị Điệp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_nhap_mon_ve_lap_trinh_bai_8_nap_chong_toan_tu_tu_k.pdf