Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 165 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
165
Dung lượng
1,93 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC KỸ THUẬT KHOA CÔNG NGHỆ THÔNG TIN - ĐIỆN TỬ VIỄN THÔNG GIÁO TRÌNH MƠN HỌC LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG BIÊN SOẠN: LÊ THỊ MỸ HẠNH ĐÀ NẴNG, 09/2002 Giáo trình mơn Lập trình hướng đối tượng Trang MỤC LỤC CHƯƠNG 1: GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG I LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) LÀ GÌ ? I.1 Lập trình tuyến tính I.2 Lập trình cấu trúc I.3 Sự trừu tượng hóa liệu I.4 Lập trình hướng đối tượng II MỘT SỐ KHÁI NIỆM MỚI TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG II.1 Sự đóng gói (Encapsulation) II.2 Tính kế thừa (Inheritance) II.3 Tính đa hình (Polymorphism) 10 III CÁC NGÔN NGỮ VÀ VÀI ỨNG DỤNG CỦA OOP 11 CHƯƠNG 2: CÁC MỞ RỘNG CỦA C++ 12 I LỊCH SỬ CỦA C++ 12 II CÁC MỞ RỘNG CỦA C++ 12 II.1 Các từ khóa C++ 12 II.2 Cách ghi thích 12 II.3 Dòng nhập/xuất chuẩn 13 II.4 Cách chuyển đổi kiểu liệu 14 II.5 Vị trí khai báo biến 14 II.6 Các biến const 15 II.7 Về struct, union enum 16 II.8 Toán tử định phạm vi 16 II.9 Toán tử new delete 17 II.10 Hàm inline 23 II.11 Các giá trị tham số mặc định 24 II.12 Phép tham chiếu 25 II.13 Phép đa hóa (Overloading) 29 CHƯƠNG 3: LỚP VÀ ĐỐI TƯỢNG 39 I DẪN NHẬP 39 II CÀI ĐẶT MỘT KIỂU DO NGƯỜI DÙNG ĐỊNH NGHĨA VỚI MỘT STRUCT 39 III CÀI ĐẶT MỘT KIỂU DỮ LIỆU TRỪU TƯỢNG VỚI MỘT LỚP 41 IV PHẠM VI LỚP VÀ TRUY CẬP CÁC THÀNH VIÊN LỚP 45 V ĐIỀU KHIỂN TRUY CẬP TỚI CÁC THÀNH VIÊN 47 VI CÁC HÀM TRUY CẬP VÀ CÁC HÀM TIỆN ÍCH 48 VII KHỞI ĐỘNG CÁC ĐỐI TƯỢNG CỦA LỚP : CONSTRUCTOR 49 VIII.SỬ DỤNG DESTRUCTOR 51 IX KHI NÀO CÁC CONSTRUTOR VÀ DESTRUCTOR ĐƯỢC GỌI ? 53 X SỬ DỤNG CÁC THÀNH VIÊN DỮ LIỆU VÀ CÁC HÀM THÀNH VIÊN 54 XI TRẢ VỀ MỘT THAM CHIẾU TỚI MỘT THÀNH VIÊN DỮ LIỆU PRIVATE 57 XII PHÉP GÁN BỞI TOÁN TỬ SAO CHÉP THÀNH VIÊN MẶC ĐỊNH 59 XIII.CÁC ĐỐI TƯỢNG HẰNG VÀ CÁC HÀMTHÀNH VIÊN CONST 60 XIV.LỚP NHƯ LÀ CÁC THÀNH VIÊN CỦA CÁC LỚP KHÁC 64 XV CÁC HÀM VÀ CÁC LỚP FRIEND 67 Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang XVI.CON TRỎ THIS 68 XVII.CÁC ĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNG 71 XVIII.CÁC THÀNH VIÊN TĨNH CỦA LỚP 72 CHƯƠNG 4: ĐA NĂNG HĨA TỐN TỬ 76 I DẪN NHẬP 76 II CÁC NGUN TẮC CƠ BẢN CỦA ĐA NĂNG HĨA TỐN TỬ 76 III CÁC GIỚI HẠN CỦA ĐA NĂNG HĨA TỐN TỬ 76 IV CÁC HÀM TỐN TỬ CĨ THỂ LÀ CÁC THÀNH VIÊN CỦA LỚP HOẶC KHÔNG LÀ CÁC THÀNH VIÊN 77 V ĐA NĂNG HỐ CÁC TỐN TỬ HAI NGƠI 80 VI ĐA NĂNG HĨA CÁC TỐN TỬ MỘT NGƠI 87 VII ĐA NĂNG HÓA MỘT SỐ TOÁN TỬ ĐẶC BIỆT 90 VII.1.Toán tử [] 91 VII.2.Toán tử () 92 VIII.TOÁN TỬ CHUYỂN ĐỔI KIỂU 94 IX TOÁN TỬ NEW VÀ DELETE 95 IX.1.Đa hóa tốn tử new delete tồn cục 96 IX.2.Đa hóa tốn tử new delete cho lớp 97 X ĐA NĂNG HĨA CÁC TỐN TỬ CHÈN DỊNG > 98 XI MỘT SỐ VÍ DỤ 99 XI.1.Lớp String 99 XI.2.Lớp Date 103 CHƯƠNG 5: TÍNH KẾ THỪA 107 I DẪN NHẬP 107 II KẾ THỪA ĐƠN 107 II.1.Các lớp sở lớp dẫn xuất 107 II.2.Các thành viên protected 109 II.3.Ép kiểu trỏ lớp sở tới trỏ lớp dẫn xuất 109 II.4.Định nghĩa lại thành viên lớp sở lớp dẫn xuất: 113 II.5.Các lớp sở public, protected private 113 II.6.Các contructor destructor lớp dẫn xuất 113 II.7.Chuyển đổi ngầm định đối tượng lớp dẫn xuất sang đối tượng lớp sở 116 III ĐA KẾ THỪA (MULTIPLE INHERITANCE) 116 IV CÁC LỚP CƠ SỞ ẢO (VIRTUAL BASE CLASSES) 119 CHƯƠNG 6: TÍNH ĐA HÌNH 122 I DẪN NHẬP 122 II PHƯƠNG THỨC ẢO (VIRTUAL FUNCTION) 122 III LỚP TRỪU TƯỢNG (ABSTRACT CLASS) 125 IV CÁC THÀNH VIÊN ẢO CỦA MỘT LỚP 127 IV.1.Toán tử ảo 127 IV.2.Có constructor destructor ảo hay khơng? 129 CHƯƠNG 7: THIẾT KẾ CHƯƠNG TRÌNH THEO HƯỚNG ĐỐI TƯỢNG 132 I DẪN NHẬP 132 II CÁC GIAI ĐOẠN PHÁT TRIỂN HỆ THỐNG 132 III CÁCH TÌM LỚP 133 IV CÁC BƯỚC CẦN THIẾT ĐỂ THIẾT KẾ CHƯƠNG TRÌNH 133 V CÁC VÍ DỤ 134 Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang CHƯƠNG 8: CÁC DẠNG NHẬP/XUẤT 143 I DẪN NHẬP 143 II CÁC DÒNG(STREAMS) 143 II.1.Các file header thư viện iostream 143 II.2.Các lớp đối tượng dòng nhập/xuất 144 III DÒNG XUẤT 145 III.1.Tốn tử chèn dịng 145 III.2.Nối tốn tử chèn dịng trích dịng 146 III.3.Xuất ký tự với hàm thành viên put(); Nối với hàm put() 147 IV DÒNG NHẬP 148 IV.1.Tốn tử trích dịng: 148 IV.2.Các hàm thành viên get() getline() 149 IV.3.Các hàm thành viên khác istream 151 IV.4.Nhập/xuất kiểu an toàn 151 V NHẬP/XUẤT KHÔNG ĐỊNH DẠNG VỚI READ(),GCOUNT() VÀ WRITE() 151 VI DÒNG NHẬP/ XUẤT FILE 152 VI.1.Nhập/xuất file văn 154 CHƯƠNG 9: HÀM VÀ LỚP TEMPLATE 159 I CÁC HÀM TEMPLATE 159 II CÁC LớP TEMPLATE 161 Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang CHƯƠNG GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG I LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) LÀ GÌ ? Lập trình hướng đối tượng (Object-Oriented Programming, viết tắt OOP) phương pháp bước đường tiến hóa việc lập trình máy tính, nhằm làm cho chương trình trở nên linh hoạt, tin cậy dễ phát triển Tuy nhiên để hiểu OOP gì, lịch sử trình lập trình – xem xét OOP tiến hóa I.1 Lập trình tuyến tính Máy tính lập trình mã nhị phân, sử dụng cơng tắt khí để nạp chương trình Cùng với xuất thiết bị lưu trữ lớn nhớ máy tính có dung lượng lớn nên ngơn ngữ lập trình cấp cao đưa vào sử dụng Thay phải suy nghĩ dãy bit byte, lập trình viên viết loạt lệnh gần với tiếng Anh sau chương trình dịch thành ngơn ngữ máy Các ngơn ngữ lập trình cấp cao thiết kế để lập chương trình làm cơng việc tương đối đơn giản tính tốn Các chương trình ban đầu chủ yếu liên quan đến tính tốn khơng địi hỏi nhiều ngơn ngữ lập trình Hơn phần lớn chương trình tương đối ngắn, thường 100 dịng Khi khả máy tính tăng lên khả để triển khai chương trình phức tạp tăng lên Các ngơn ngữ lập trình ngày trước khơng cịn thích hợp việc lập trình địi hỏi cao Các phương tiện cần thiết để sử dụng lại phần mã chương trình viết khơng có ngơn ngữ lập trình tuyến tính Thật ra, đoạn lệnh thường phải chép lặp lại dùng nhiều chương trình chương trình dài dịng, logic chương trình khó hiểu Chương trình điều khiển để nhảy đến nhiều chỗ mà thường khơng có giải thích rõ ràng, làm để chương trình đến chỗ cần thiết Ngơn ngữ lập trình tuyến tính khơng có khả kiểm sốt phạm vi nhìn thấy liệu Mọi liệu chương trình liệu tồn cục nghĩa chúng bị sửa đổi phần chương trình Việc dị tìm thay đổi khơng mong muốn phần tử liệu dãy mã lệnh dài vòng làm cho lập trình viên thời gian I.2 Lập trình cấu trúc Rõ ràng ngôn ngữ với tính cần phải phát triển để tạo ứng dụng tinh vi Vào cuối năm 1960 1970, ngôn ngữ lập trình có cấu trúc đời Các chương trình có cấu trúc tổ chức theo cơng việc mà chúng thực Về chất, chương trình chia nhỏ thành chương trình riêng rẽ (cịn gọi hàm hay thủ tục) thực công việc rời rạc trình lớn hơn, phức tạp Các hàm giữ độc lập với nhiều tốt, hàm có liệu logic riêng.Thông tin chuyển giao hàm thông qua tham số, hàm có biến cục mà khơng nằm bên ngồi phạm vi hàm lại truy xuất chúng Như vậy, hàm xem chương trình đặt chung với để xây dựng nên ứng dụng Mục tiêu cho việc triển khai phần mềm dễ dàng lập trình viên mà cải thiện tính tin cậy dễ bảo quản chương trình Một chương trình có cấu trúc hình thành cách bẻ gãy chức chương trình thành mảnh nhỏ mà sau trở thành hàm Bằng cách cô lập công việc vào hàm, chương trình có cấu trúc làm giảm khả hàm ảnh hưởng đến hàm khác Việc làm cho việc tách vấn đề trở nên dễ dàng Sự gói gọn cho phép viết chương trình sáng sủa giữ điều khiển hàm Các biến tồn cục khơng thay tham số biến cục có phạm vi nhỏ dễ kiểm soát Cách tổ chức tốt nói lên có khả quản lý logic cấu trúc chương trình, làm cho việc triển khai bảo dưỡng chương trình nhanh hữu hiệu Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang Một khái niệm lớn đưa lập trình có cấu trúc trừu tượng hóa (Abstraction) Sự trừu tượng hóa xem khả quan sát việc mà không cần xem xét đến chi tiết bên Trong chương trình có cấu trúc, cần biết hàm cho làm cơng việc cụ thể đủ Cịn làm mà cơng việc lại thực khơng quan trọng, chừng hàm cịn tin cậy cịn dùng mà khơng cần phải biết thực đắn chức Điều gọi trừu tượng hóa theo chức (Functional abstraction) tảng lập trình có cấu trúc Ngày nay, kỹ thuật thiết kế lập trình có cấu trúc sử rộng rãi Gần ngôn ngữ lập trình có phương tiện cần thiết phép lập trình có cấu trúc Chương trình có cấu trúc dễ viết, dễ bảo dưỡng chương trình không cấu trúc Sự nâng cấp cho kiểu liệu ứng dụng mà lập trình viên viết tiếp tục diễn Khi độ phức tạp chương trình tăng lên, phụ thuộc vào kiểu liệu mà xử lý tăng theo Vấn đề trở rõ ràng cấu trúc liệu chương trình quan trọng chẳng phép tốn thực chúng Điều trở rõ ràng kích thước chương trình tăng Các kiểu liệu xử lý nhiều hàm khác bên chương trình có cấu trúc Khi có thay đổi liệu cần phải thực thay đổi nơi có thao tác tác động chúng Đây cơng việc tốn thời gian hiệu chương trình có hàng ngàn dòng lệnh hàng trăm hàm trở lên Một yếu điểm việc lập trình có cấu trúc có nhiều lập trình viên làm việc theo nhóm ứng dụng Trong chương trình có cấu trúc, lập trình viên phân công viết tập hợp hàm kiểu liệu Vì có nhiều lập trình viên khác quản lý hàm riêng, có liên quan đến kiểu liệu dùng chung nên thay đổi mà lập trình viên tạo phần tử liệu làm ảnh hưởng đến công việc tất người cịn lại nhóm Mặc dù bối cảnh làm việc theo nhóm, việc viết chương trình có cấu trúc dễ dàng sai sót việc trao đổi thơng tin thành viên nhóm dẫn tới hậu nhiều thời gian để sửa chữa chương trình I.3 Sự trừu tượng hóa liệu Sự trừu tượng hóa liệu (Data abstraction) tác động liệu tương tự trừu tượng hóa theo chức Khi có trừu tượng hóa liệu, cấu trúc liệu phần tử sử dụng mà không cần bận tâm đến chi tiết cụ thể Chẳng hạn số dấu chấm động trừu tượng hóa tất ngơn ngữ lập trình, Chúng ta khơng cần quan tâm cách biểu diễn nhị phân xác cho số dấu chấm động gán giá trị, khơng cần biết tính bất thường phép nhân nhị phân nhân giá trị dấu chấm động Điều quan trọng số dấu chấm động hoạt động đắn hiểu Sự trừu tượng hóa liệu giúp bận tâm chi tiết khơng cần thiết Nếu lập trình viên phải hiểu biết tất khía cạnh vấn đề, lúc tất hàm chương trình hàm viết ra, may mắn thay trừu tượng hóa theo liệu tồn sẵn ngôn ngữ lập trình liệu phức tạp số dấu chấm động Tuy nhiên gần đây, người ta phát triển ngôn ngữ cho phép định nghĩa kiểu liệu trừu tượng riêng I.4 Lập trình hướng đối tượng Khái niệm hướng đối tượng xây dựng tảng khái niệm lập trình có cấu trúc trừu tượng hóa liệu Sự thay đổi chỗ, chương trình hướng đối tượng thiết kế xoay quanh liệu mà làm việc đó, theo thân chức chương trình Điều hồn tồn tự nhiên hiểu mục tiêu chương trình xử lý liệu Suy cho cùng, công việc mà máy tính thực thường gọi xử lý liệu Dữ liệu thao tác liên kết với mức (cịn gọi mức thấp), thứ đòi hỏi thứ có mục tiêu cụ thể, chương trình hướng đối tượng làm tường minh mối quan hệ Lập trình hướng đối tượng (Object Oriented Programming - gọi tắt OOP) hay chi tiết Lập trình định hướng đối tượng, phương pháp lập trình lấy đối tượng làm tảng để xây dựng thuật giải, xây Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang dựng chương trình Thực chất phương pháp mà cách nhìn việc lập trình Để phân biệt, với phương pháp lập trình theo kiểu cấu trúc mà quen thuộc trước đây, hay cịn gọi phương pháp lập trình hướng thủ tục (Procedure-Oriented Programming), người lập trình phân tích nhiệm vụ lớn thành nhiều cơng việc nhỏ hơn, sau chi tiết, cụ thể hoá để vấn đề đơn giản, để tìm cách giải vấn đề dạng thuật giải cụ thể rõ ràng qua dễ dàng minh hoạ ngơn ngữ giải thuật (hay gọi thuật giải chương trình con) Cách thức phân tích thiết kế gọi nguyên lý lập trình từ xuống (top-down), để thể trình suy diễn từ chung cụ thể Các chương trình chức độc lập, ghép nối chúng lại với cho hệ thống chương trình để giải vấn đề đặt Chính vậy, cách thức phân tích hệ thống lấy chương trình làm tảng, chương trình đóng vai trị trung tâm việc lập trình, hiểu phương pháp lập trình hướg thủ tục Tuy nhiên, phân tích để thiết kế hệ thống không thiết phải luôn suy nghĩ theo hướng “làm để giải công việc”, định hướng tư theo phong cách “với số đối tượng có, phải làm để giải cơng việc đặt ra” phong phú hơn, “làm với số đối tượng có đó”, từ giải công việc cụ thể Với phương pháp phân tích đối tượng đóng vai trị trùng tâm việc lập trình vậy, người ta gọi ngun lý lập trình từ lên (Bơttm-up) Lập trình hướng đối tượng liên kết cấu trúc liệu với thao tác, theo cách mà tất thường nghĩ giới quanh Chúng ta thường gắn số hoạt động cụ thể với loại hoạt động đặt giả thiết quan hệ Ví dụ1.1: Để dễ hình dùng hơn, thủ nhìn qua cơng trình xây dựng đại, sân vận động có mái che hình vịng cung, kiến trúc thẩm mĩ với đường nét hình cong Tất sản phẩm xuất với vật liệu xây dựng Ngày nay, không chồng lên viên gạch, tảng đá để tạo nên quần thể kiến trúc (như Tháp Chàm Nha Trang, Kim Tự Tháp, ), mà với bêtơng, sắt thép khơng nhiều viên gạch, người xây dựng thiết kế cơng trình kiến trúc tuyệt mỹ, tồ nhà đại Chính chất liệu xây dựng làm ảnh hưởng phương pháp xây dựng, chất liệu xây dựng ngun lý kết dính cấ chất liệu lại với cho đối tượng để khảo sát, Chất liệu xây dựng nguyên lý kết dính chất liệu lại với hiểu theo nghĩa liệu chương trình tác động liệu Ví dụ1.2: Chúng ta biết xe có bánh xe, di chuyển đổi hướng cách quẹo tay lái Tương tự thế, một loại thực vật có thân gỗ Một xe cây, mà khơng phải xe, giả thiết mà làm với xe khơng thể làm với Chẳng hạn, thật vô nghĩa muốn lái cây, xe lại chẳng lớn thêm tưới nước cho Lập trình hướng đối tượng cho phép sử dụng trình suy nghĩ với khái niệm trừu tượng sử dụng chương trình máy tính Một mẫu tin (record) nhân đọc ra, thay đổi lưu trữ lại; cịn số phức dùng tính tốn Tuy khơng thể lại viết số phức vào tập tin làm mẫu tin nhân ngược lại hai mẫu tin nhân lại cộng với Một chương trình hướng đối tượng xác định đặc điểm hành vi cụ thể kiểu liệu, điều cho phép biết cách xác có kiểu liệu khác Chúng ta cịn tạo quan hệ kiểu liệu tương tự khác chương trình hướng đối tượng Người ta thường tự nhiên phân loại thứ, thường đặt mối liên hệ khái niệm với khái niệm có, thường thực suy diễn chúng quan hệ Hãy quan niệm giới theo kiểu cấu trúc cây, với mức xây dựng chi tiết cho hệ sau so với hệ trước Đây phương pháp hiệu để tổ chức giới quanh Các chương trình hướng đối tượng làm việc theo phương thức tương tự, chúng cho phép xây dựng các cấu liệu thao tác dựa cấu có sẵn, mang theo tính cấu mà chúng dựa đó, thêm vào tính Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang Lập trình hướng đối tượng cho phép tổ chức liệu chương trình theo cách tương tự nhà sinh học tổ chức loại thực vật khác Theo cách nói lập trình đối tượng, xe hơi, cối, số phức, sách gọi lớp (Class) Một lớp mẫu mô tả thông tin cấu trúc liệu, lẫn thao tác hợp lệ phần tử liệu Khi phần tử liệu khai báo phần tử lớp gọi đối tượng (Object) Các hàm định nghĩa hợp lệ lớp gọi phương thức (Method) chúng hàm xử lý liệu đối tượng lớp Một thực thể (Instance) vật thể có thực bên nhớ, thực chất đối tượng (nghĩa đối tượng cấp phát vùng nhớ) Mỗi đối tượng có riêng cho phần tử liệu lớp gọi biến thực thể (Instance variable) Các phương thức định nghĩa lớp gọi đối tượng lớp Điều gọi gửi thơng điệp (Message) cho đối tượng Các thông điệp phụ thuộc vào đối tượng, đối tượng nhận thông điệp phải làm việc theo thơng điệp Các đối tượng độc lập với thay đổi biến thể đối tượng khơng ảnh hưởng biến thể đối tượng khác việc gửi thông điệp cho đối tượng khơng ảnh hưởng đến đối tượng khác Như vậy, đối tợng hiểu theo nghĩa thực thể mà cấ liệu thủ tục tác động lên liệu đóng gói lại với Hay “đối tượng đặc trưng số thao tác (operation) thông tin (information) ghi nhơ tác động cấ thao tác này.” Ví dụ 1.3: Khi nghiên ngăn xếp (stack), liệu vùng chứa ngăn xếp, đỉnh ngăn xếp, phải cài đặt kèm theo thao tác khởi tạo (creat) ngăn xếp, kiểm tra ngăn xếp rỗng (empty), đẩy (push) phần tử vào ngăn xếp, lấy (pop) phần tử khỏi ngăn xếp Trên quan điểm lấy đối tượng làm tảng, rõ ràng liệu thao tác liệu ln gắn bó với nhau, kết dính chúng đối tượng cần khảo sát Các thao tác đối tượng gọi phương thức hay hành vi đối tượng Phương thức liệu đối tượng ln tác động lẫn có vai trị ngang đối tượng, Phương thức đối tượng qui định liệu ngược lại, liệu đối tượng đặt trưng phương thức đối tượng Chính nhờ gắn bó đó, gởi thơng điệp đến đối tượng khác Điều giúp người lập trình khơng phải xử lý chương trình dãy cấu trúc điều khiển tuỳ theo thông điệp nhận vào, mà chương trình xử lý vào thời điểm thực Tóm lại, so sánh lập trình cấu trúc với chương trình làm tảng: Chương trình = Cấu trúc liệu + Thuật giải Trong lập trình hướng đối tượng có: Đối tượng = Phương thức + Dữ liệu Đây quan điểm lập trình tồn phát triển giới ngày II MỘT SỐ KHÁI NIỆM MỚI TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Trong phần này, tìm hiểu khái niệm đóng gói, tính kế thừa tính đa hình Đây khái niệm bản, tảng tư tưởng lập trình hướng đối tượng Hiểu khái niệm này, 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 tảng mà quan điểm che dấu thơng tin thơng qua sư đóng gói quan điểm trung tâm vấn đề II.1 Sự đóng gói (Encapsulation) Sự đóng gói chế ràng buộc liệu thao tác liệu thành thể thống nhất, tránh tác động bất ngờ từ bên Thể thống gọi đối tượng Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang Trong Objetc Oriented Software Engineering Ivar Jacibson, tất thông tin hệ thống định hướng đối tượng lưu trữ bên đối tượng hành động đối tượng lệnh thực thao tác Như vật, đóng gói không đơn gom chung liệu chương trình vào khối, chúng cịn hiểu theo nghĩa đồng liệu thao tác tác động lên liệu Trong đối tượng, liệu hay thao tác hay hai riêng (private) chung (public) đối tượng Thao tác hay liệu riêng thuộc đối tượng truy cập thành phần đối tượng, điều nghĩa thao tác hay liệu riêng truy cập phần khác chương trình tồn đối tượng Khi thao tác hay liệu chung, phần khác chương trình truy cập nó định nghĩa đối tượng Các thành phần chung đối tượng dùng để cung cấp giao diện có điều khiển cho thành thành riêng đối tượng Cơ chế đóng gói phương thức tốt để thực chế che dấu thông tin so với ngôn ngữ lập trình cấu trúc II.2 Tính kế thừa (Inheritance) Chúng ta xây dựng lớp từ lớp cũ thông qua kế thừa Một lớp cịn gọi lớp dẫn xuất (derived class), thừa hưởng liệu phương thức lớp sở (base class) ban đầu Trong lớp này, bổ sung thành phần liệu phương thức vào thành phần liệu phương thức mà thừa hưởng từ lớp sở Mỗi lớp (kể lớp dẫn xuất) có số lượng lớp dẫn xuất Qua cấu kế thừa này, dạng hình lớp hình thành Dạng lớp trơng giống gia phả lớp sở gọi lớp cha (parent class) lớp dẫn xuất gọi lớp (child class) Ví dụ 1.2: Chúng ta xây dựng tập lớp mô tả cho thư viện ấn phẩm Có hai kiểu ấn phẩm: tạp chí sách Chúng ta tạo ấn phẩm tổng quát cách định nghĩa thành phần liệu tương ứng với số trang, mã số tra cứu, ngày tháng xuất bản, quyền nhà xuất Các ấn phẩm lấy ra, cất đọc Đó phương thức thực ấn phẩm Tiếp định nghĩa hai lớp dẫn xuất tên tạp chí sách Tạp chí có tên, số ký phát hành chứa nhiều tác giả khác Các thành phần liệu tương ứng với yếu tố đặt vào định nghĩa lớp tạp chí Tạp chí cần có phương thức đặt mua Các thành phần liệu xác định cho sách bao gồm tên (các) tác giả, loại bìa (cứng hay mềm) số hiệu ISBN Như thấy, sách tạp chí có chung đặc trưng ấn phẩm, có thuộc tính riêng chúng Hình 1.1: Lớp ấn phẩm lớp dẫn xuất Với tính kế thừa, khơng phải cơng xây dựng lại từ đầu lớp mới, cần bổ sung để có lớp dẫn xuất đặc trưng cần thiết Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang 10 II.3 Tính đa hình (Polymorphism) Đó khả thơng điệp thay đổi cách thực theo lớp cụ thể đối tượng nhận thông điệp Khi lớp dẫn xuất tạo ra, thay đổi cách thực phương thức mà thừa hưởng từ lớp sở Một thơng điệp gởi đến đối tượng lớp sở, dùng phương thức định nghĩa cho lớp sở Nếu lớp dẫn xuất định nghĩa lại phương thức thừa hưởng từ lớp sở thơng điệp có tên với phương thức này, gởi tới đối tượng lớp dẫn xuất gọi phương thức định nghĩa cho lớp dẫn xuất Như đa hình khả cho phép gởi thông điệp đến đối tượng khác có chung đặc điểm, nói cách khác thơng điệp gởi khơng cần biết thực thể nhận thuộc lớp nào, biết tập hợp thực thể nhận có chung tính chất Chẳng hạn, thơng điệp “vẽ hình” gởi đến hai đối tượng hình hộp hình trịn Trong hai đối tượng có chung phương thức vẽ hình, nhiên tuỳ theo thời điểm mà đối tượng nhận thơng điệp, hình tương ứng vẽ lên Trong ngơn ngữ lập trình OOP, tính đa hình thể qua khả cho phép mơ tả phương thức có tên giống lớp khác Đặc điểm giúp người lập trình viết cấu trúc điều khiển rườm rà chương trình, khả khác thơng điệp thực địi hỏi chương trình thực Ví dụ 1.3: Xét lại ví dụ 1.2, thấy tạp chí và sách phải có khả lấy Tuy nhiên phương pháp lấy cho tạp chí có khác so với phương pháp lấy cho sách, kết cuối giống Khi phải lấy tạp chí, phải sử dụng phương pháp lấy riêng cho tạp chí (dựa tra cứu) lấy sách lại phải sử dụng phương pháp lấy riêng cho sách (dựa hệ thống phiếu lưu trữ) Tính đa hình cho phép xác định phương thức để lấy tạp chí hay sách Khi lấy tạp chí dùng phương thức lấy dành riêng cho tạp chí, cịn lấy sách sử dụng phương thức lấy tương ứng với sách Kết cần tên phương thức dùng cho hai công việc tiến hành hai lớp dẫn xuất có liên quan, việc thực phương thức thay đổi tùy theo lớp Tính đa hình dựa nối kết (Binding), q trình gắn phương thức với hàm thực Khi phương thức kiểu đa hình sử dụng trình biên dịch chưa thể xác định hàm tương ứng với phương thức gọi Hàm cụ thể gọi tuỳ thuộc vào việc phần tử nhận thông điệp lúc thuộc lớp nào, hàm gọi xác định vào lúc chương trình chạy Điều gọi kết nối muộn (Late binding) hay kết nối lúc chạy (Runtime binding) xảy chương trình thực Hình 1.2: Minh họa tính đa hình lớp ấn phẩm lớp dẫn xuất Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang 151 Hình 8.13: Kết ví dụ 8.11 IV.3 Các hàm thành viên khác istream Hàm ignore(): istream& ignore(int nCount = 1, int delim = EOF); Trích loại bỏ lên đến nCount ký tự Việc trích dừng delim bắt gặp end-of-file bắt gặp Hàm putback(): istream& putback(char ch); Đặt ký tự ngược lại dòng nhập Hàm peek(): int peek(); Hàm trả ký tự mà khơng trích từ dịng IV.4 Nhập/xuất kiểu an toàn C++ cung cấp nhập/xuất kiểu an tồn (type-safe) Các tốn tử > đa hóa để nhận mục liệu kiểu cụ thể Nếu liệu bất ngờ xử lý, cờ hiệu lỗi khác thiết lập mà người dùng kiểm tra để xác định thao tác nhập/xuất thành công thất bại Phần sau khảo sát kỹ V NHẬP/XUẤT KHƠNG ĐỊNH DẠNG VỚI READ(),GCOUNT() VÀ WRITE() Nhập/xuất khơng định dạng thực với hàm thành viên istream::read() ostream::write() Hàm istream::read(): istream& read(unsigned char* puch, int nCount); istream& read(signed char* psch, int nCount); Trích byte từ dòng giới hạn nCount đạt đến end- of-file đạt đến Hàm có ích cho dịng nhập nhị phân Hàm ostream::write(): ostream& write(const unsigned char* puch, int nCount); ostream& write(const signed char* psch, int nCount); Chèn nCount byte vào từ vùng đệm (được trỏ puch psch) vào dòng Nếu file mở chế độ text, ký tự CR chèn vào Hàm có ích cho dòng xuất nhị phân Chẳng hạn: char Buff[]="HAPPY BIRTHDAY"; Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang 152 cout.write(Buff,10); Hàm istream::gcount(): int gcount(); Hàm trả số ký tự trích hàm nhập khơng định dạng cuối VI DỊNG NHẬP/ XUẤT FILE Để thực thi xử lý file C++, chương trình phải include tập tin Header gồm định nghĩa cho lớp dòng ifstream cho nhập (đọc) từ file, ofstream cho xuất (ghi) tới file) fstream cho nhập/xuất (đọc/ghi) tới file Các file mở cách tạo đối tượng lớp dòng Cây phả hệ lớp hình 8.2 • Constructor lớp ofstream: (1) ofstream(); (2) ofstream(const char* szName,int nMode=ios::out,int nProt=filebuf::openprot); (3) ofstream(int fd); (4) ofstream(filedesc fd, char* pch, int nLength); Trong đó: szName: Tên file mở nMode: Một số nguyên chứa bit mode định nghĩa kiểu liệy kê ios Có thể kết hợp tốn tử | Tham số giá trị sau: Mode Ý nghĩa ios::app Hàm di chuyển trỏ file tới end-of-file Khi byte ghi lên file, chúng luôn nối thêm vào cuối, vị trí di chuyển với hàm ostream::seekp() ios::ate Hàm di chuyển trỏ file tới end-of-file Khi byte ghi lên file, chúng luôn nối thêm vào cuối, byte ghi, chúng ghi vào vị trí hành ios::in Mở file để đọc.Với dòng ifstream, việc mở file đương nhiên thực chế độ ios::out Mở file để đọc.Với dòng ofstream, việc mở file đương nhiên thực chế độ ios::trunc Xóa file có đĩa tạo file tên Cũng có hiểu chặt cụt file cũ, làm cho kích thước 0, chuẩn bị ghi nội dung Mode áp dụng ios::out định ios::app, ios::ate, ios::in không định ios::nocreate Nếu file khơng tồn thao tác mở thất bại ios::noreplace Nếu file tồn thao tác mở thất bại ios::binary Mở file chế độ nhị phân (mặc định chế độ văn bản) nProt: Đặc tả chế độ bảo vệ file fd: Mã nhận diện file Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang 153 pch: Con trỏ trỏ tới vùng dành riêng chiều dài nLength Giá trị NULL (hoặc nLength=0) dẫn đến dịng khơng vùng đệm nLength: Chiều dài tính theo byte vùng dành riêng (0=không vùng đệm) Dạng (1) xây dựng đối tượng ofstream mà không mở file Dạng (2) xây dựng đối tượng ofstream mở file định Dạng (3) xây dựng đối tượng ofstream gắn (attach) với file mở Dạng (4) xây dựng đối tượng ofstream mà liên kết với đối tượng filebuf Đối tượng filebuf gắn tới file mở vùng dành riêng • Constructor lớp ifstream: (1) ifstream(); (2) ifstream(const char* szName,int nMode=ios::in,int nProt=filebuf::openprot); (3) ifstream(int fd); (4) ifstream(filedesc fd, char* pch, int nLength); Dạng (1) xây dựng đối tượng ifstream mà không mở file Dạng (2) xây dựng đối tượng ifstream mở file định Dạng (3) xây dựng đối tượng ifstream gắn (attach) với file mở Dạng (4) xây dựng đối tượng ofstream mà liên kết với đối tượng filebuf Đối tượng filebuf gắn tới file mở vùng dành riêng • Constructor lớp fstream: (1) fstream(); (2) fstream(const char* szName,int nMode,int nProt=filebuf::openprot); (3) fstream(int fd); (4) fstream(filedesc fd, char* pch, int nLength); Dạng (1) xây dựng đối tượng fstream mà không mở file Dạng (2) xây dựng đối tượng fstream mở file định Dạng (3) xây dựng đối tượng fstream gắn (attach) với file mở Dạng (4) xây dựng đối tượng ofstream mà liên kết với đối tượng filebuf Đối tượng filebuf gắn tới file mở vùng dành riêng Nếu sử dụng constructor dạng (1) dùng hàm open() để mở file: • Hàm ofstream::open(): void open(const char* szName,int nMode=ios::out,int nProt=filebuf::openprot); Hàm ifstream::open(): void open(const char* szName,int nMode=ios::in,int nProt=filebuf::openprot); Hàm fstream::open(): void open(const char* szName,int nMode,int nProt=filebuf::openprot); Để đóng file dùng hàm close(), hàm lớp ifstream, ofstream, fstream có dạng: void close(); Biên soạn: Lê Thị Mỹ Hạnh Giáo trình mơn Lập trình hướng đối tượng Trang 154 Các hàm liên quan đến trỏ file: - Lớp istream: Hàm seekg(): (seek get) (1) istream& seekg(streampos pos); (2) istream& seekg(streamoff off,ios::seek_dir dir); Trong đó: + pos: Vị trí streampos tương đương typedef với long + off: Giá trị offset tương đương typedef với long + dir: hướng seek Có trị sau: Seek từ bắt đầu dòng ios::begin ios::cur Seek tư øvị trí hành dịng ios::end Seek từ cuối dòng Hàm tellg(): (tell get) streampos tellg(); Hàm trả vị trí hành trỏ file - Lớp ostream: Hàm seekp(): (seek put) (1) ostream& seekp(streampos pos); (2) ostream& seekp(streamoff off,ios::seek_dir dir); Hàm tellp(): (tell put) streampos tellp(); Hàm trả vị trí hành trỏ file VI.1 Nhập/xuất file văn Nếu dòng gắn với file văn bản, việc nhập/xuất file thực cách đơn giản toán tử >>