Bài tập Định nghĩa lớp Nhân viên [Employee] Private:Tên, Tuổi, Giới Tính, Quốc Tịch Public: void printCheck[] Protected:CMTND Định nghĩa hai lớp con kế thừa từ lớp Nhân_Viên Nhân viên được trả lương [SalariedEmployee] Nhân viên bán thời gian, theo giờ [HourlyEmployee] Định nghĩa lại hàm printCheck[] riêng của hai lớp conTóm tắt về kế thừa Kế thừa cho phép sử dụng lại code Cho phép một lớp kế thừa từ lớp khác và thêm các chức năng mới Lớp con kế thừa những thành viên của lớp cơ sở và có thể thêm thành viên mới Biến thành viên private trong lớp cơ sở không thể được truy xuất “theo tên” trong lớp con Hàm thành viên private không được kế thừa, chỉ được sử dụng riêng ở lớp cơ sở Có thể định nghĩa lại hàm thành viên của lớp cơ sở trong lớp con Các lớp con khác nhau có thể có những định nghĩa khác nhau Thành viên trong khu vực protected của l
Bạn đang xem trước 20 trang tài liệu Giáo trình Ngôn ngữ lập trình - Bài 6: Nạp chồng toán tử và Kế thừa - Lê Nguyễn Tuấn Thành, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Ngôn ngữ lập trình Bài 6: Nạp Chồng Toán Tử và Kế Thừa Giảng viên: Lê Nguyễn Tuấn Thành Email: Bộ Môn Công Nghệ Phần Mềm – Khoa CNTT Trường Đại Học Thủy Lợi Nội dung 2 Nạp chồng toán tử [Operator Overloading] và Hàm bạn [Friend Functions] Kế thừa [Inheritance] Bài giảng có sử dụng hình vẽ trong cuốn sách “Absolute C++. W. Savitch, Addison Wesley, 2002” 1. Nạp chồng toán tử và Hàm bạn Operator Overloading and Friend Functions Mục tiêu 4 Nạp chồng toán tử cơ bản Toán tử hai ngôi [binary operators] Toán tử một ngôi [unary operators] Nạp chồng bằng hàm thành viên Hàm bạn và Lớp bạn L ớ p M o n e y 5 Giới thiệu nạp chồng toán tử 6 Những toán tử như +,-, %, == etc. thực ra là những hàm! Các hàm đặc biệt này được gọi với cú pháp khác so với cách gọi hàm thông thường Gọi hàm thông thường: Tên_Hàm [Danh_Sách_Đối_Số] Với toán tử: ví dụ, x + 7, “+” là một toán tử 2 ngôi [binary operator] với x, 7 là 2 toán hạng [operands] Thử viết theo cách gọi hàm thông thường: +[x,7] “+” là tên hàm x, 7 là tham số của hàm Hàm “+” trả lại giá trị là tổng của 2 đối số Tại sao dùng nạp chồng toán tử? 7 Những toán tử được xây dựng sẵn Ví dụ, +, -, = , %, ==, /, * Đã thao tác được với các kiểu dựng sẵn của C++ Nhưng liệu chúng ta có thể thực hiện phép + với 2 đối tượng của lớp Money?, giống như: money1 + money2; Để làm được điều này, chúng ta phải nạp chồng những toán tử này cho lớp Money! Cơ bản về nạp chồng 8 Nạp chồng toán tử Tương tự như với nạp chồng hàm Toán tử bản thân nó 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 toán tử + với toán hạng là đối tượng kiểu Money Giá trị trả lại là một kiểu Money Mục đích: cho phép thực hiện phép + trên hai đối tượng của lớp Money Nạp chồng toán tử “+” 9 const Money operator + [const Money& amount1, const Money& amount2]; Chú ý: hàm nạp chồng toán tử “+” này không phải hàm thành viên của lớp Money Định nghĩa, cài đặt của hàm này phức tạp hơn so với phép cộng thông thường [phải tính đến biến thành viên, kiểm tra giá trị âm/dương, ] Định nghĩa nạp chồng toán tử “+” cho lớp Money 10 Nạp chồng toán tử “==” 11 Toán tử so sánh bằng “==” Cho phép so sánh các đối tượng của lớp Money Khai báo: bool operator ==[const Money& amount1, const Money& amount2]; Hàm này cũng không phải là hàm thành viên của lớp Money Nạp chồng toán tử một ngôi [Unary operators] 12 Toán tử một ngôi: chỉ có một toán hạng Toán tử phủ định [negation] “-” X = -Y // đặt X bằng giá trị phủ định của Y Toán tử tăng ++ Toán tử giảm -- Nạp chồng toán tử “-” cho lớp Money 13 Khai báo hàm nạp chồng toán tử “-” cho lớp Money const Money operator –[const Money& amount]; Không phải hàm thành viên của lớp Chú ý: chỉ có một đối số, do toán tử này chỉ có một toán hạng Định nghĩa hàm nạp chồng toán tử một ngôi “-” const Money operator –[const Money& amount] { return Money[-amount.getDollars[], -amount.getCents[]]; } Trả lại một đối tượng vô danh [anonymous object] Lưu ý: nạp chồng toán tử “-” có hai trường hợp! Khi nó là toán tử 2 ngôi, với 2 toán hạng/đối số Khi nó là toán tử 1 ngôi, với 1 toán hạng/đối số Sử dụng nạp chồng toán tử “-” 14 Xét ví dụ sau: Money amount1[10], amount2[6], amount3; amount3 = amount1 – amount2; => Gọi nạp chồng toán tử 2 ngôi “-” amount3 = -amount1; => Gọi hàm nạp chồng toán tử 1 ngôi “-” Nạp chồng toán tử như hàm thành viên [1/2] 15 Những ví dụ ở trước: các hàm đứng độc lập không phải thành viên của lớp Có thể nạp chồng như “toán tử thành viên”, được xem như hàm thành viên Khi toán tử là hàm thành viên Chỉ có MỘT tham số, không phải có 2 tham số! Được tượng được gọi [phía sau toán tử] được xem là tham số duy nhất Nạp chồng toán tử như hàm thành viên [2/2] 16 Ví dụ: Money cost[1, 50], tax[0, 15], total; total = cost + tax; Nếu toán tử “+” được nạp chồng như toán tử thành viên thì: Biến/ đối tượng cost là đối tượng gọi hàm nạp chồng Đối tượng tax là tham số duy nhất của hàm nạp chồng Tưởng tượng giống như cách viết sau total = cost.+[tax]; Khai báo của toán tử “+” trong định nghĩa lớp const Money operator +[const Money& amount]; Chú ý CHỈ CÓ MỘT đối số Nạp chồng một số toán tử khác 17 Toán tử gọi hàm: [] Toán tử &, ||, dấu phẩy Toán tử gán = [assignment operator], phải được nạp chồng như hàm thành viên! Toán tử tăng, giảm: ++, -- Mỗi toán tử có 2 phiên bản: Tiền tố [prefix notation]: ++x; Hậu tố [postfix notation]: x++; Toán tử mảng [ ], nạp chồng như hàm thành viên! Toán tử >>, > và myObject; Thay vì phải viết: myObject.output[]; myObject.input[]; Toán tử chèn