ỦY BAN NHÂN DÂN TỈNH ĐỒNG THÁP TRƯỜNG CAO ĐẲNG CỘNG ĐỒNG ĐỒNG THÁP GIÁO TRÌNH MÔN HỌC: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG NGÀNH, NGHỀ: CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ: CAO ĐẲNG (Ban hành kèm theo Quyết định số /QĐ-CĐCĐ ngày tháng năm 20… của Hiệu trưởng trường Cao đẳng Cộng đồng Đồng Tháp) Đồng Tháp, năm 2017 TUYÊN BỐ BẢN QUYỀN Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo. Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm. i LỜI NÓI ĐẦU Bài giảng sẽ trình bày một cách hệ thống các khái niệm của lập trình hƣớng đối tƣợng đƣợc cài đặt trong C++ nhƣ: lớp, đối tƣợng, sự kế thừa, tính đa hình. Bên cạnh đó, bài giảng cũng giới thiệu chi tiết cách thiết kế một chƣơng trình hƣớng đối tƣợng đến ngƣời học.
Bài giảng bao gồm các chƣơng sau: Chƣơng 1: LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG Chƣơng 2: CÁC ĐẶC ĐIỂM CỦA C++ Chƣơng 3: LỚP VÀ ĐỐI TƢỢNG Chƣơng 4: THỪA KẾ Chƣơng 5: TÍNH ĐA HÌNH Chƣơng 6: THIẾT KẾ CHƢƠNG TRÌNH HƢỚNG ĐỐI TƢỢNG Cuối cùng, xin gửi lời cảm ơn chân thành nhất đến bạn bè, đồng nghiệp đã có những ý kiến đóng góp sâu sắc cho bài giảng này. Mọi ý kiến đóng góp xin vui lòng gửi đến địa chỉ mail: pqcuong@dtcc. Xin chân thành cảm ơn! Đồng Tháp, ngày 01 tháng 07 năm 2017 Tác giả Phan Quốc Cƣờng i MỤC LỤC LỜI NÓI ĐẦU .ii DANH MỤC CÁC HÌNH. 1 LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG .1 Thế nào là lập trình hƣớng đối tƣợng .2 Một số khái niệm quan trọng.
3 CÂU HỎI ÔN TẬP CHƢƠNG 1. 9 CÁC ĐẶC ĐIỂM CỦA C++ .1 Cấu trúc chƣơng trình .2 Cấu trúc điều khiển .1 Cấu trúc điều kiện: if và else .2 Các cấu trúc lặp .3 Các lệnh rẽ nhánh và lệnh nhảy .3 Con trỏ và chuỗi ký tự .4 Tham số mặc định của hàm .6 Truyền tham số. 64 BÀI TẬP THỰC HÀNH CHƢƠNG 2. 76 LỚP VÀ ĐỐI TƢỢNG .3 Phạm vi lớp và truy cập các thành viên lớp.4 Hàm tạo và hàm hủy .2 Dùng hàm tạo trong khai báo .3 Dùng hàm tạo trong cấp phát bộ nhớ .4 Dùng hàm tạo để biểu diễn các đối tƣợng hằng.5 Hàm tạo mặc định .7 Hàm tạo và hàm hủy đƣợc gọi khi nào? .5 Đối tƣợng hằng và hàm thành viên hằng .6 Hàm bạn và lớp bạn .7 Hàm thành viên tĩnh .8 Con trỏ this.
134 BÀI TẬP THỰC HÀNH CHƢƠNG 3 .1 Ép kiểu các con trỏ lớp cơ sở tới các con trỏ lớp dẫn xuất .2 Các lớp cơ sở public, protected và private .3 Các constructor và destructor lớp dẫn xuất.3 Các lớp cơ sở ảo (virtual base classes). 167 BÀI TẬP THỰC HÀNH CHƢƠNG 4 .2 Phƣơng thức ảo (virtual function) .3 Các đặc trƣng của phƣơng thức ảo.4 Lớp trừu tƣợng (Abstract class) .5 Các thành viên ảo của một lớp .1 Toán tử ảo .2 Có constructor và destructor ảo hay không?. 194 BÀI TẬP THỰC HÀNH CHƢƠNG 5. 200 THIẾT KẾ CHƢƠNG TRÌNH THEO HƢỚNG ĐỐI TƢỢNG .1 Các giai đoạn phát triển hệ thống.3 Các bƣớc cần thiết để thiết kế chƣơng trình .4 Một số ví dụ minh họa.
204 BÀI TẬP THỰC HÀNH CHƢƠNG 6. 221 TÀI LIỆU THAM KHẢO. 222 Trang iv DANH MỤC CÁC HÌNH Hình 1 - Lớp ấn phẩm và các lớp dẫn xuất của nó. 5 Hình 2 – Minh họa tính đa hình đối với ấn phẩm và các lớp dẫn xuất của nó.
7 Hình 3 – Kết quả tính thể tích hình hộp. 49 Hình 4 – Kết quả tính thể tích hình lập phƣơng. 52 Hình 5 – Một đối tƣợng phần mềm. 81 Hình 6 – Đối tƣợng phần mềm xe đạp.
82 Hình 7 – Kết quả minh họa phạm vi lớp. 84 Hình 8 – TBD báo lỗi. 86 Hình 9 – Kết quả chƣơng trình có sử dụng hảm hủy. 98 Hình 10 – Kết quả chƣơng trình minh họa thứ tự các constructor và destructor đƣợc gọi.
101 Hình 11 – Lỗi biên dịch. 106 Hình 12 – Kết quả khởi tạo một hằng của kiểu dữ liệu có sẵn. 109 Hình 13 – Trình biên dịch thông báo lỗi. 109 Hình 14 – Kết quả minh họa sử dụng tƣờng minh của con trỏ this.
136 Hình 15 – Kết quả trả về một tham chiếu tới một đối tƣợng Time. 141 Hình 16 – Minh họa phân cấp kế thừa đơn. 146 Hình 17 – Phân cấp lớp Shape. 146 Hình 18 – Kết quả minh họa.
153 Hình 19 - Minh họa thứ tự các contructor và destructor lớp cơ sở và lớp dẫn xuất đƣợc gọi. 160 Hình 20 – Kết quả minh họa. 166 Hình 21 – Kết quả sau khi lớp cơ sở ảo. 171 Hình 22 – Kết quả chƣơng trình.
180 Hình 23 – Kết quả minh họa các tính chất phƣơng thức ảo. 184 Hình 24 – Mô tả tính đa hình của hàm Print(). 185 Hình 25 – Kết quả ví dụ minh họa tính đa hình hàm Print(). 188 Trang v Hình 26 – Kết quả ví dụ minh họa đa năng hóa toán tử với hàm toán tử là phƣơng thức ảo.
194 Hình 27 – Kết quả minh họa destructor ảo. 196 Hình 28 - Tìm ra những gì tồn tại chung giữa các đối tƣợng. 203 Hình 29 - Tiếp tục theo hƣớng từ dƣới lên. 204 Hình 30 – Các lớp Nguoi, BienChe, HopDong.
205 Hình 31 – Kết quả chƣơng trình tính tiền lƣơng của các nhân viên trong cơ quan theo các dạng khác nhau. 212 Hình 32 – Các lớp Nguoi, SinhVien, GiangVien. 213 Hình 33 – Kết quả ví dụ 2. 220 Trang vi Chƣơng 1 LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG MỤC ĐÍCH Phân biệt sự khác nhau giữa lập trình cổ điển và lập trình hƣớng đối tƣợng; giới thiệu các khái niệm quan trọng trong lập trình hƣớng đối tƣợng nhƣ: đối tƣợng, thể hiện, lớp; và giới thiệu các đặc điểm chính của lập trình hƣớng đối tƣợng nhƣ: tính đóng gói, tính kế thừa, tính đa hình.
Nhiệm vụ tự học và tài liệu tham khảo của sinh viên trong chƣơng 1 Để đạt đƣợc mục đích đề ra trong chƣơng 1, sinh viên phải thực hiện tốt các yêu cầu sau đây: Xem trƣớc đề cƣơng chi tiết của Chƣơng 1 để biết đƣợc mục đích, nội dung sẽ đƣợc trình bày trong chƣơng này Phải đọc trƣớc nội dung Chƣơng 1 trong quyển bài giảng này trƣớc khi lên lớp 1.1 Thế nào là lập trình hƣớng đối tƣợng Phƣơng pháp lập trình cấu trúc - Tƣ tƣởng chính của lập trình cấu trúc là tổ chức chƣơng trình thành các chƣơng trình con. Trong PASCAL có 2 kiểu chƣơng trình con là thủ tục và hàm. Trong C chỉ có một loại chƣơng trình con là hàm. Hàm là một đơn vị chƣơng trình độc lập dùng để thực hiện một phần việc nào đó nhƣ: Nhập số liệu, in kết quả hay thực hiện một số tính toán.
Hàm cần có đối và các biến, mảng cục bộ dùng riêng cho hàm. - Các ngôn ngữ nhƣ C, PASCAL, FOXPRO là các ngôn ngữ cho phép triển khai phƣơng pháp lập trình cấu trúc. Một chƣơng trình cấu trúc gồm các cấu trúc dữ liệu (nhƣ biến, mảng, bản ghi) và các hàm, thủ tục. Nhiệm vụ chính của việc tổ chức thiết kế chƣơng trình cấu trúc là tổ chức chƣơng trình thành các hàm, thủ tục: Chƣơng trình sẽ bao gồm các hàm, thủ tục nào.
Trang 1 Phƣơng pháp lập trình hƣớng đối tƣợng Khái niệm trung tâm của lập trình hƣớng đối tƣợng là lớp (class). Có thể xem lớp là sự kết hợp các thành phần dữ liệu và các hàm. Cũng có thể xem lớp là sự mở rộng của cấu trúc trong C (struct) bằng cách đƣa thêm vào các phƣơng thức (method) hay cũng gọi là hàm thành viên (member function). Một lớp đƣợc định nghĩa nhƣ sau: class Tên_Lớp { // Khai báo các thành phần dữ liệu // Khai báo các phƣơng thức }; Các phƣơng thức có thể đƣợc viết (xây dựng) bên trong hoặc bên ngoài (phía dƣới) phần định nghĩa lớp.
Cấu trúc (cách viết) phƣơng thức tƣơng tự nhƣ hàm ngoại trừ quy tắc sau: Khi xây dựng một phƣơng thức bên ngoài định nghĩa lớp thì trong dòng đầu tiên cần dùng tên lớp và dấu :: đặt trƣớc tên phƣơng thức để chỉ phƣơng thức thuộc lớp nào. Sử dụng các thành phần dữ liệu trong phƣơng thức: Vì phƣơng thức và các thành phần dữ liệu thuộc cùng một lớp và vì phƣơng thức đƣợc lập lên cốt để xử lý các thành phần dữ liệu, nên trong thân của phƣơng thức có quyền truy nhập đến các thành phần dữ liệu (của cùng lớp). Biến lớp: Sau khi định nghĩa một lớp, có thể dùng tên lớp để khai báo các biến kiểu lớp hay cũng gọi là đối tƣợng. Mỗi đối tƣợng sẽ có các thành phần dữ liệu và các phƣơng thức.
Lời gọi một phƣơng thức cần chứa tên đối tƣợng để xác định phƣơng thức thực hiện từ đối tƣợng nào. Một chƣơng trình hƣớng đối tƣợng sẽ bao gồm các lớp có quan hệ với nhau. Việc phân tích, thiết kế chƣơng trình theo phƣơng pháp hƣớng đối tƣợng nhằm thiết kế, xây dựng Trang 2 các lớp. Từ khái niệm lớp nẩy sinh hàng loạt khái niệm khác nhƣ: Thành phần dữ liệu, phƣơng thức, phạm vi, sự đóng gói, hàm tạo, hàm huỷ, sự thừa kế, lớp cơ sử, lớp dẫn xuất, tƣơng ứng bội, phƣơng thức ảo,.
Ƣu điểm của việc thiết kế hƣớng đối tƣợng là tập trung xác định các lớp để mô tả các thực thể của bài toán. Mỗi lớp đƣa vào các thành phần dữ liệu của thực thể và xây dựng luôn các phƣơng thức để xử lý dữ liệu. Nhƣ vậy việc thiết kế chƣơng trình xuất phát từ các nội dụng, các vấn đề của bài toán. Các ngôn ngữ thuần tuý hƣớng đối tƣợng (nhƣ Smalltalk) chỉ hỗ trợ các khái niệm về lớp, không có các khái niệm hàm.
C++ là ngôn ngữ lai, nó cho phép sử dụng cả các công cụ của lớp và hàm.2 Một số khái niệm quan trọng Trong phần này, chúng ta tìm hiểu các khái niệm nhƣ sự đóng gói, tính kế thừa và tính đa hình. Đây là các khái niệm căn bản, là nền tảng tƣ tƣởng của lập trình hƣớng đối tƣợng. Hiểu đƣợc khái niệm này, chúng ta bƣớc đầu tiếp cận với phong cách lập trình mới, phong cách lập trình dựa vào đối tƣợng làm nền tảng mà trong đó quan điểm che dấu thông tin thông qua sƣ đóng gói là quan điểm trung tâm của vấn đề.