1. Trang chủ
  2. » Công Nghệ Thông Tin

LẬP TRÌNH HưỚNG ĐỐI TưỢNG VÀ C++

20 39 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 420,8 KB

Nội dung

BỘ GIAO THÔNG VẬN TẢI TRƢỜNG ĐẠI HỌC HÀNG HẢI BỘ MÔN: KHOA HỌC MÁ Y TÍ NH KHOA: CÔNG NGHỆ THƠNG TIN BÀI GIẢNG LẬP TRÌNH HƢỚNG ĐỐI TƢỢNG VÀ C++ TÊN HỌC PHẦN : Lập trình hƣớng đối tƣợng C++ MÃ HỌC PHẦN : 17209 TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY DÙNG CHO SV NGÀNH : CƠNG NGHỆ THƠNG TIN HẢI PHỊNG - 2008 Mô tả vắn tắt nội dung khối lượng học phần Tên học phần: Lập trình hướng đối tượng C++ Bộ môn phụ trách giảng dạy: Khoa học máy tính Mã học phần: 17209 TS tiết 75 Lý thuyết 45 Thực hành/ Xemina 30 Tự học Loại học phần : Khoa phụ trách: CNTT Tổng số TC: Bài tập lớn Đồ án môn học Điều kiện tiên quyết: Sinh viên phải học thi đạt học phần sau đăng ký học học phần này: Kỹ thuật lập trình Pascal, Kỹ thuật lập trình C Mục tiêu học phần: Cung cấp kiến thức phương pháp lập trình hướng đối tượng rèn luyện kỹ lập trình Nội dung chủ yếu: - Những mở rộng lập trình hướng đối tượng - Đối tượng lớp - Đóng gói, thừa kế, đa hình - Bản mẫu, thư viện STL Nội dung chi tiết: TÊN CHƢƠNG MỤC Chƣơng 1: Lâ ̣p trin ̀ h hướng đố i tươ ̣ng và TS PHÂN PHỐI SỐ TIẾT LT Thực hành BT KT ngôn ngữ C++ 1.1 Ưu điểm lập trình hướng đối tượng 1.2 Giới thiệu ngơn ngữ C++ Chƣơng 2: Những khái niê ̣m mở đầ u Chƣơng 3: Con trỏ, tham chiế u và hàm 3 18 2.1 Cài đặt ngôn ngữ C++ 2.2 Cấu trúc chương trình C++ 2.3 Kiểu liệu sở 2.4 Quy tắc sử dụng từ khóa, tên chuẩn, tên từ đặt 2.5 Các thị gán, so sánh, điều kiện 3.1 Khai báo hàm con, hàm 3.2 Quy tắc đổi kiểu liệu, kiểu trỏ 3.3 Định nghĩa chồng hàm, tham số ngầm định 3.5 Tham chiểu Chƣơng 4: Các dòng vào C++ 4.1 Đối tượng vào cout, cin 4.2 Đẩy dòng liệu lên hình 4.3 Nhập dòng liệu từ bàn phím 4.4 Định dạng dòng liệu hiển thị 4.5 Vào với tệp Chƣơng 5: Đối tượng Lớp i 5.1 Định nghĩa đối tượng 5.2 Khai báo lớp 5.3 Hàm thiết lập, huỷ bỏ 5.4 Thành phần tĩnh, hàm bạn, lớp bạn 5.5 Định nghĩa chồng toán tử Chƣơng 6: Thừa kế 6.1 Lớp sở, lớp dẫn xuất 6.2 Quy tắc thừa kế 6.3 Tương thích lớp sở lớp dẫn xuất 6.4 Đơn thừa kế, đa thừa kế Chƣơng 7: Ràng buộc động Đa thể 13 6 7.1 Hàm ảo, ràng buộc tĩnh, động 7.2 Đa thể Chƣơng 8: Bản mẫu 8.1 Hàm mẫu 8.2 Ưu khuyết điểm hàm mẫu 8.3 Lớp mẫu Nhiệm vụ sinh viên: Lên lớp đầy đủ chấp hành quy định Nhà trường Tài liệu học tập: Tên tác giả Tên sách Nhà xuất Năm xuất Phạm Văn Ất Kỹ thuật lập trình hướng đối tượng NXB KHKT 1998 Một số website liên quan Hình thức tiêu chuẩn đánh giá sinh viên: - Thi viết thi thực hành - Sinh viên phải bảo đảm điều kiện theo Quy chế Nhà trường Bộ Thang điểm : Thang điểm chữ A,B,C,D,F Điểm đánh giá học phần: Z=0,3X+0,7Y Bài giảng tài liệu thức thống Bộ mơn Khoa học Máy tính, Khoa Cơng nghệ Thơng tin dùng để giảng dạy cho sinh viên Ngày phê duyệt: / /20 Trƣởng Bộ môn: ThS Nguyễn Hữu Tuân (ký ghi rõ họ tên) ii MỤC LỤC CHƢƠNG I: LẬP TRÌ NH HƢỚNG ĐỐI TƢỢNG VÀ NGÔN NGỮ C++ 1 Sự phát triển kỹ thuật lập trình 1.1 Lâ ̣p triǹ h không có cấ u trúc (hay lâ ̣p triǹ h tuyế n tiń h) 1.2 Lâ ̣p trình thủ tu ̣c hay lâ ̣p trình có cấ u trúc 1.3 Lâ ̣p triǹ h module 1.4 Lâ ̣p triǹ h hướng đố i tượng Mô ̣t số khái niê ̣m lập trình hướng đớ i tượng 2.1 Kiể u liê ̣u trừu tượng ADT(Astract Data Type) 2.2 Đối tượng (Objects) lớp (Classes) 2.3 Kế thừa (Inheritance) 2.4 Dynamic Binding (ràng buộc động) Porlymorphism (đa xa ̣ hoă ̣c đa thể ) Ngôn ngữ lâ ̣p triǹ h C++ OOP 3.1 Sự phát triển ngôn ngữ lâ ̣p triǹ h hướng đố i tượng 3.2 Ngôn ngữ lâ ̣p trình C++ Bài tập CHƢƠNG II: NHỮNG KHÁI NIỆM MỞ ĐẦU Chương trình đầ u tiên 1.1 Quá trình biên dịch chương triǹ h C++ 1.2 Chương triǹ h đầ u tiên 13 Biế n, hằ ng và tầ m hoa ̣t đô ̣ng của các biế n 15 2.1 Cú pháp khai báo biến (variable declaration) 15 2.2 Tầ m hoa ̣t đô ̣ng của các biế n 16 2.3 Khai báo biế n cú pháp của các câu lê ̣nh điề u khiể n 16 2.4 Các kiểu biến 17 2.5 Liên kế t biế n biên dich ̣ 18 2.6 Các hằng 18 Hàm C++ 19 Các cấu trúc điều khiển 20 4.1 Câu lê ̣nh if-else 20 4.2 Vòng lặp không xác định while 20 4.3 Vòng lặp không xác định – while 21 4.4 Vòng lặp xác định for 21 4.5 Các từ khóa break continue 22 4.6 Câu lê ̣nh lựa cho ̣n switch 22 4.7 Câu lê ̣nh goto 23 4.8 Đệ qui 23 iii Các kiểu liê ̣u C++ 23 Mô ̣t số toán tử C++ 25 6.1 Toán tử gán (assignment operator) 25 6.2 Các toán tử toán học 25 6.3 Các toán tử quan ̣ 25 6.4 Các toán tử logic 26 6.5 Các toán tử bitwise 26 6.6 Các toán tử dịch 26 6.7 Các toán tử mô ̣t 26 6.8 Toán tử 26 6.9 Toán tử dấ u phẩ y 27 6.10 Các lỗi thường gă ̣p sử dụng toán tử 27 6.11 Toán tử chuyể n kiể u 27 6.12 Toán tử sizeof 28 Các kiểu liê ̣u người dùng đinh ̣ nghiã 28 Bài tập 31 CHƢƠNG III: CON TRỎ, THAM CHIẾU VÀ HÀ M 34 Hàm C++ 34 1.1 Nguyên mẫu và đinh ̣ nghĩa hàm 34 1.2 Hàm biến 34 1.3 Truyề n tham số 34 1.4 Chồ ng hàm (overload) tham số mặc định hàm 35 1.5 Các vấn đề khác 36 Con trỏ, hàm mảng 37 Hàm xử lý xâu 38 Bài tập 38 CHƢƠNG IV: CÁC DÒNG VÀO RA TRONG C++ 40 Tổ ng quan về các luồ ng vào của C++ 40 Các luồng đệm 41 Các đối tượng vào chuẩ n 41 Đinh ̣ hướng la ̣i (Redirection) 41 Nhâ ̣p liê ̣u với cin 42 Các hàm thành viên khác của cin 42 Kế t xuấ t liê ̣u với cout 45 Các dòng vào hàm printf 46 Vào liê ̣u với các file 46 10 File text và file nhi ̣phân 48 iv 11 Tìm kiếm dòng vào 48 12 stringstream 49 13 Bài tập 52 CHƢƠNG V: ĐỐI TƢỢNG VÀ LỚP 54 Trừu tượng liê ̣u 54 Thế nào là mô ̣t đố i tượng? 54 Các lớp và các đố i tượng 55 Con trỏ và mảng các đố i tượng 58 Khai báo các lớp với các file header 59 Kiể m soát viê ̣c truy câ ̣p tới các biế n và phương thức của lớp 61 Các hàm bạn lớp ba ̣n 62 Con trỏ this 66 Khởi ta ̣o các đố i tượng của lớp thông qua các hàm cấ u tử 67 10 Hủy tử 72 11 Cấ u tử copy 76 12 Đối tượng hằ ng và các hàm thành viên hằ ng 78 13 Các thành viên tĩnh lớp 79 14 Sử dụng đối tượng vai trò tham số hàm 80 15 Các đối tượng chồ ng nhau: Các lớp là thành viên của các lớp khác 82 16 Chồ ng toán tử 84 17 Bài tập 91 CHƢƠNG VI: KẾ THỪA (INHERITANCE) 94 Sử dụng lại mã chương triǹ h 94 Sử dụng lại mã chương triǹ h OOP 94 Cú pháp kế thừa 94 Đinh ̣ nghĩa lại thành viên lớp sở 96 Kiể m soát truy câ ̣p 98 Các kiểu kế thừa 101 6.1 Kế thừa public 101 6.2 Kế thừa private 101 6.3 Kế thừa protected 102 Đinh ̣ nghiã la ̣i các đă ̣c tả truy câ ̣p 102 Các hàm kế thừa 103 Các hàm cấu tử kế thừa 103 10 Composition và Inheritance 105 11 Đa kế thừa 107 12 Lă ̣p la ̣i lớp sở đa kế thừa và lớp sở ảo 108 v 13 Con trỏ và các đố i tượng 109 14 Con trỏ và kế thừa 116 15 Bài tập 117 CHƢƠNG VII: RÀNG BUỘC ĐỘNG VÀ ĐA THỂ 118 Mô ̣t số đă ̣c điể m của ràng buô ̣c đô ̣ng đa thể 118 1.1 Ràng buộc động 118 1.2 Đa thể - Polymorphism 118 Các hàm thành viên bình thường truy câ ̣p qua các trỏ 119 Các hàm thành viên ảo truy câ ̣p qua các trỏ 120 Ràng buộc động 122 4.1 Ràng buộc động làm việc thế nào 122 4.2 Không sử dụng trỏ this 124 Danh sách liên kế t các đố i tượng và đa thể 124 Các lớp trừu tượng – abstract class 128 Các hàm ảo thực 129 7.1 Ví dụ 129 7.2 Ví dụ 131 Cấ u tử ảo hủy tử ảo 135 Hàm toán tử ảo 136 10 Bài tập 139 CHƢƠNG VIII: BẢN MẪU (TEMPLATE) 140 Các lớp mẫu 140 1.1 Các mẫu thể nghiệm 141 1.2 Các thành phần tĩnh 146 1.3 Các lớp ba ̣n và lớp trợ giúp 147 1.4 Các tham số mẫu 149 1.5 Các lớp thuô ̣c tiń h 151 1.6 Các lớp chứa (bản mẫu) chuẩ n 154 Các hàm mẫu 154 2.1 Các định nghĩa thể nghiệm 154 2.2 Các hàm chuẩn chung – thư viê ̣n thuâ ̣t toán 157 Bài tập 157 TÀI LIỆU THAM KHẢO 158 ĐỀ THI THAM KHẢO 159 vi CHƢƠNG I: LẬP TRÌ NH HƢỚNG ĐỐI TƢỢNG VÀ NGÔN NGƢ̃ C++ Sƣ ̣ phát triể n của các kỹ thuâ ̣t lâ ̣p trin ̀ h Phầ n này trình bày về mô ̣t số kỹ thuâ ̣t hay p hương pháp lâ ̣p trình đươ ̣c phát triể n để giải vấn đề Tin học kể từ máy tính đời Sự phát triể n của các kỹ thuâ ̣t lâ ̣p triǹ h liên quan chă ̣t chẽ tới sự phát triể n phầ n cứng của máy vi tiń h cũng v iê ̣c ứng dụng máy tính vào giải vấn đề thực tế Chúng ta chia phương pháp lập trình thành kiểu sau: + Lâ ̣p triǹ h không có cấ u trúc + Lâ ̣p triǹ h hướng thủ tu ̣c + Lâ ̣p trình theo kiể u module hóa + Lâ ̣p trình hướng đố i tươ ̣ng Chúng ta sẽ xem xét kỹ thuật lập trình 1.1 Lâ ̣p trin ̀ h không có cấ u trúc (hay lâ ̣p trin ̀ h tuyế n tính) Thông thường mo ̣i người bắ t đầ u ho ̣c lâ ̣p trình bằ ng cách viế t các chương trình nhỏ đơn giản chứa “chương trình chính” Ở chương trình có nghĩa mơ ̣t tâ ̣p các lê ̣nh hoă ̣c câu lê ̣nh làm viê ̣c với các dữ liê ̣u toàn cu ̣c cả chương triǹ h (các biế n dùng chương triǹ h biến tồn cục) Chúng ta minh hoạ bằng hình vẽ sau đây: Lâ ̣p trin ̀ h không có cấ u trúc Chƣơng trin ̀ h chính thao tác trƣ̣c tiế p các dƣ̃ liêụ toàn cu ̣c Mô ̣t số nhươ ̣c điể m của lâ ̣p triǹ h không có cấ u trúc: + Lâ ̣p trình không có cấ u trúc không có khả kiể m soát tính thấ y đươ ̣c của dữ liê ̣u Mọi liệu chương trình biến tồn cục bị thay đổi bất kỳ phần chương trình + Viê ̣c khơng kiể m soát đươ ̣c tiń h thấ y đươ ̣c của dữ liê ̣u dẫn đế n các khó khăn viê ̣c gỡ lỗi chương triǹ h, đă ̣c biê ̣t là các chương triǹ h lớn + Kỹ thuật lập trình khơng có cấu trúc có nhiều bất lợi lớn chương trình đủ lớn Ví dụ chúng ta cần thực lại đoạn câu lệnh tập liệu khác b ̣c phải copy đoa ̣n lê ̣nh đó tới vi ̣trí chương triǹ h mà chúng ta muố n thực hiê ̣n Điề u này làm nảy sinh ý tưởng trích các đo ạn lệnh thường xuyên cần thực , đă ̣t tên cho chúng và đưa mô ̣t kỹ thuâ ̣t cho phép go ̣i và trả về các giá tri ̣từ các thủ tu ̣c này 1.2 Lâ ̣p trin ̀ h thủ tu ̣c hay lâ ̣p trin ̀ h có cấ u trúc Với lâ ̣p triǹ h thủ tu ̣c hay hướng thủ tục chúng ta nhóm câu lệnh thường xuyên thực hiê ̣n chương triǹ h chiń h la ̣i mô ̣t chỗ và đă ̣t tên đoa ̣n câu lê ̣nh đó thành mô ̣t thủ tu ̣c Mô ̣t lời go ̣i tới thủ tu ̣c sẽ đươ ̣c sử du ̣ng để thực hiê ̣n đoa ̣n câu lê ̣nh đó Sau thủ tục thực xong điều khiển chương trình trả sau vị trí lời gọi tới thủ tục chương trình Với các chế truyề n tham số cho thủ tu ̣c chúng ta có chương trình Mơ ̣t chươn g triǹ h chiń h bao gồ m nhiề u chương triǹ h và các chương triǹ h đươ ̣c viế t mang tiń h cấ u trúc cao , đồ ng thời cũng it́ lỗi Nế u mô ̣t chương trình là đúng đắ n thì kế t quả thực hiê ̣n trả về đúng và chúng ta khôn g cầ n phải quan tâm tới chi tiết bên thủ tục Còn có lỡi chúng ta thu hẹp phạm vi gỡ lỡi chương trình chưa chứng minh đúng đắn , đươ ̣c xem trừu tươ ̣ng hàm và là nề n tảng cho lâ ̣p triǹ h thủ tu ̣c Mô ̣t chương trình chính với lâ ̣p trình thủ tu ̣c có thể đươ ̣c xem là tâ ̣p hơ ̣p các lời go ̣i thủ tục Lâ ̣p trin ̀ h thủ tu ̣c Sau chƣơng trin ̀ h thƣ ̣c hiêṇ xong điề u khiể n đƣơ ̣c trả về sau vi tri ̣ ́ lời go ̣i tới chƣơng trin ̀ h Chương triǹ h chiń h có nhiê ̣m vu ̣ truyề n các dữ liê ̣u cho các lời go ̣i cu ̣ thể , dữ liê ̣u đươ ̣c xử lý cu ̣c bô ̣ chương trình sau đó các kế t quả thực hiê ̣n này đươ ̣c trả về cho chương trình Như vâ ̣y l̀ ng dữ liê ̣u có thể đươ ̣c minh ho ̣a là mô ̣t đồ thi ̣phân cấ p, mô ̣t cây: Lâ ̣p trin ̀ h hƣớng thủ tu ̣c Chƣơng trin ̀ h chính phố i hơ ̣p các lời gọi tới thủ tục với liệu thích hợp tham số Lâ ̣p trình hướng thủ tu ̣c là mô ̣t kỹ thuâ ̣t lâ ̣p trình có nhiề u ưu điể m Khái niệm chương triǹ h là mô ̣t ý tưởng rấ t hay , cho phép chương trình lớn chia thành nhiề u chương triǹ h nhỏ , đo đó dễ viế t và it́ lỗi Để có thể sử dụng thủ tục chung nhóm thủ tục chương trình khác , người ta đã phát minh mô ̣t kỹ thuâ ̣t lâ ̣p trình mới , đó là kỹ thuâ ̣t lâ ̣p trình theo kiể u module 1.3 Lâ ̣p trin ̀ h module Trong lâ ̣p triǹ h module các thủ tu ̣c có cùng mô ̣t chức chung sẽ đươ ̣c nhóm la ̣i với ta ̣o thành mô ̣t module riêng biê ̣t Mô ̣t chương triǹ h sẽ không chỉ bao gồ m mô ̣t phầ n đơn lẻ Nó chia thành vài phầ n nhỏ tương tác với qua các lời go ̣i thủ tục tạo thành toàn chương trình Lâ ̣p trin ̀ h module Chƣơng trin ̀ h chính là sƣ̣ kế t hơ ̣p giƣ̃a các lời go ̣i tới các thủ tục module riêng biệt với liệu thích hơ ̣p Mỗi module có dữ liê ̣u riêng của nó Điề u này cho phép các module có thể kiể m soát liệu riêng bằng lời gọi tới thủ tục module Tuy nhiên mỗi module chỉ xuấ t hiê ̣n nhiề u nhấ t mô ̣t lầ n cả chương triǹ h Yế u điể m của lâ ̣p triǹ h thủ tu ̣c và lâ ̣p triǹ h module hóa: + Khi đô ̣ phức ta ̣p của chương trình tăng lên sự phu ̣ thuô ̣c của nó vào các kiể u dữ liê ̣u bản mà nó xử lý cũng tăng theo Vấ n đề trở nên rõ ràng rằ ng cấ u trúc dữ liê ̣u sử dụng chương trình cũng quan trọng khơng kém phép tốn thực chúng Điề u này càng lô ̣ rõ kić h thước chương triǹ h tăng Các kiểu liệu xử lý nhiều các thủ tu ̣c của mô ̣t chương trình có cấ u trúc Do đó thay đổ i cài đă ̣t của mô ̣t kiể u dữ liê ̣u sẽ dẫn đế n nhiề u thay đổ i các thủ tu ̣c sử du ̣ng nó + Mô ̣t nhươ ̣c điể m nữa là cầ n dùng nhiề u nhóm làm viê ̣c để xây dựng mô ̣t chương trình chung Trong lâ ̣p trình có cấ u trúc mỗi người sẽ đươ ̣c giao xây dựng mô ̣t số thủ tục kiểu liệu Những lâ ̣p triǹ h viên xử lý các thủ tu ̣c khác la ̣i có liên quan tới các kiể u dữ liê ̣u dùng chung nên nế u mô ̣t người thay đổ i kiể u dữ liê ̣u thì sẽ làm ảnh hưởng tới công việc nhiều người khác , đă ̣c biê ̣t là có sai sót viê ̣c liên la ̣c giữa các thành viên của nhóm + Viê ̣c phát triể n các phầ m mề m mấ t nhi ều thời gian tập trung xây dựng lại cấu trúc liệu Khi xây dựng mô ̣t chương triǹ h mới lâ ̣p triǹ h có cấ u trúc lâ ̣p trình viên thường phải xây dựng lại cấu trúc liệu cho phù hợp với toán điề u này rấ t mấ t thời gian 1.4 Lâ ̣p trin ̀ h hƣớng đố i tƣơ ̣ng Trong lâ ̣p triǹ h hướng đố i tươ ̣ng mỗi chương triǹ h chúng ta có mô ̣t sớ các đớ i tươ ̣ng (object) tương tác với , thuô ̣c các lớp (class) khác nhau, mỗi đố i tươ ̣ng tự quản lý lấ y các dữ liê ̣u của riêng chúng Lâ ̣p triǹ h hướng đố i tươ ̣ng Các đối tượng tương tác với bằng cách gửi thông điệp Chương trình chính sẽ bao gồ m mô ̣t số đố i tươ ̣ng là thể hiê ̣n (instance) lớp , đối tượng tương tác với thực chức chương trình Các lớp lâ ̣p triǹ h hướng đố i tươ ̣ng có thể xem là mô ̣t sự trừu tươ ̣ng ở mức cao của cấu trúc (struct hay record) hay kiể u dữ liê ̣u người dùng đinh ̣ nghiã các ngôn ngữ lâ ̣p trình có cấ u trúc với sự tích hơ ̣p cả các toán tử và dữ liê ̣u các kiể u đó Các ưu điểm lập trình hướng đối tượng: + Lâ ̣p trình hướng đố i tươ ̣ng đời đã giải quyế t đươ ̣c nhiề u nhươ ̣c điể m tồ n ta ̣i lâ ̣p triǹ h có cấ u trúc Trong lâ ̣p triǹ h OOP có it́ lỗi và viê ̣c gỡ lỗi cũng đơn giản hơn, đồ ng thời lâ ̣p triǹ h theo nhóm có thể thực hiê ̣n rấ t hiê ̣u quả Ít lỗi là mô ̣t các ưu điể m chính của OOP vì theo thố ng kê thì viê ̣c bảo trì ̣ thố ng phầ n mề m sau giao cho người dùng chiế m tới 70% giá thành phần mềm + Viê ̣c thay đổ i các cài đă ̣t chi tiế t bên dưới lâ ̣p triǹ h OOP không làm ảnh hương tới các phầ n khác của chương trình đó viê ̣c mở rô ̣ng qui mô của mơ ̣t chương trình dễ dàng hơn, đờ ng thời làm giảm thời gian cầ n thiế t để phát triể n phầ n mề m + Với khái niê ̣m kế thừa các lâ ̣p trình viên có thể xây dựng các chương trình từ các phầ n mề m sẵn có + OOP có tiń h khả chuyể n cao Mô ̣t chương triǹ h viế t mô ̣t ̣ thố ng nề n (chẳ ng hạn Windows) chạy nhiều hệ thống khác (chẳ ng ̣n Linux, Unix…) + OOP có hiê ̣u quả cao Thực tế cho thấ y các ̣ thố ng đươ ̣c xây dựng bằ ng OOP có hiê ̣u cao Mô ̣t số khái niêm ̣ bản của lâ ̣p trin ̀ h hƣớng đố i tƣơ ̣ng 2.1 Kiể u dƣ̃ liêụ trƣ̀u tƣơ ̣ng ADT(Astract Data Type) Mô ̣t số người đinh ̣ nghiã OOP là lâ ̣p trình với các kiể u dữ liê ̣u trừu tươ ̣ng và các mố i quan ̣ giữa chúng Trong phầ n này chúng ta sẽ xem xét các kiể u dữ liê ̣u trừu tươ ̣ng khái niệm OOP sử dụng số ví dụ để minh họa Đinh ̣ nghiã về kiể u dữ liê ̣u trừu tươ ̣ng : Mô ̣t kiể u dữ liê ̣u trừu tươ ̣ng là mô ̣t mô hiǹ h toán học đối tượng liệu tạo thành kiểu liệu toán tử (phép tốn) thao tác các đớ i tươ ̣ng đó Chú ý định nghĩa toán tử thao tác đố i tươ ̣ng dữ liê ̣u gắ n liề n với các đố i tươ ̣ng ta ̣o thành mô ̣t kiể u dữ liê ̣u trừu tươ ̣ng Đặc tả về mô ̣t kiể u dữ liê ̣u trừu tươ ̣ng không có bấ t kỳ mô ̣t chi tiế t cu ̣ thể nào về cài đă ̣t bên kiểu liệu Viê ̣c cài đă ̣t mô ̣t kiể u dữ liê ̣u trừu tươ ̣ng đòi hỏi mô ̣t quá triǹ h chuyể n đổ i từ đă ̣c tả của nó sang mô ̣t cài đă ̣t cu ̣ thể mô ̣t ngôn ngữ lâ ̣p triǹ h cu ̣ thể Điề u này cho phép chúng ta phân biệt ADT với thuật ngữ kiểu liệu (data type) cấu trúc liê ̣u (data structure) Thuâ ̣t ngữ kiể u dữ liê ̣u đề câ ̣p tới mô ̣t cài đă ̣t cu ̣ thể (có thể kiểu built in hoă ̣c người dùng đinh nghĩa) mô hình tốn học đặc tả ̣ ADT Cấ u trúc dữ liê ̣u đề câ ̣p tới mô ̣t tâ ̣p các biế n có cùng kiể u đươ ̣c gắ n kế t với theo mơ ̣t cách thức xác đinh ̣ nào đó Ví dụ kiểu liệu trừu tượng: Số nguyên Kiể u dữ liê ̣u trừu tươ ̣ng số nguyên: ADT Integer: Dƣ̃ liêu: ̣ mô ̣t tâ ̣p các chữ số và mô ̣t dấ u tiề n tố là + hoă ̣c - Chúng ta ký hiệu số N Các tốn tử: constructor: khởi ta ̣o mơ ̣t số nguyên sub(k): trả hiệu N – k add(k): trả tổng N + k …… End 2.2 Đối tƣợng (Objects) lớp (Classes) Trong mô ̣t chương triǹ h hướng đố i tươ ̣ng chúng ta có các đố i tươ ̣ng Các đối tượng đại diện cho đối tượng thực thực tế Có thể coi i niê ̣m đớ i tươ ̣ng OOP chính là các kiể u dữ liê ̣u các ngôn ngữ lâ ̣p trình có cấ u trúc Mỗi mô ̣t đố i tươ ̣ng có liệu riêng gọi member variable data member Các toán tử thao tác liệu gọi member function Mỗi mô ̣t đố i tươ ̣ng là thể hiê ̣n (instance) lớp Như vâ ̣y lớp là đa ̣i diê ̣n cho các đố i tươ ̣ng có các member function giố ng và các data member cùng kiể u Lớp trừu tượng hóa khái niệm đối tượng Tuy nhiên lớp khơng phải là mơ ̣t ADT , cài đặt đă ̣c tả ADT Các đối tượng lớp chia sẻ liệu dùng chung , dữ liê ̣u kiể u này gọi class variable 2.3 Kế thƣ̀a (Inheritance) Khái niệm kế thừa sinh từ nhu cầu sử dụng lại thành phần phần mềm để phát triể n các phầ n mề m mới hoă ̣c mở rô ̣ng chức của phầ n mề m hiê ̣n ta ̣i Kế thừa là mô ̣ t chế cho phép các đố i tươ ̣ng của mô ̣t lớp có thể truy câ ̣p tới các member variable và function của mô ̣t lớp đã đươ ̣c xây dựng trước đó mà không cầ n xây dựng la ̣i các thành phầ n đó Điề u này cho phép chúng ta có thể ta ̣o r a các lớp mới là mô ̣t mở rô ̣ng hoă ̣c cá biê ̣t hóa lớp sẵn có Lớp mới (gọi derived class ) kế thừa từ lớp cũ (gọi lớp sở base class) Các ngơn ngữ lập trình hướng đối tượng hỗ trợ khái niệm đa kế thừa cho phép lớp kế thừa từ nhiều lớp sở Lớp kế thừa derived class có thể có thêm data member member function Thêm vào đó lớp kế thừa có thể tiế n hành định nghĩa lại hàm lớp sở và trường hơ ̣p này người ta nói rằ ng lớp kế thừa đã overload hàm thành viên của lớp sở 2.4 Dynamic Binding (ràng buộc động) Porlymorphism (đa xa ̣ hoă ̣c đa thể ) Chúng ta lấy ví dụ để minh hoạ cho hai k hái niệm Giả sử chúng ta có lớp sở là Shape , hai lớp kế thừa từ lớp Shape là Circle và Rectange Lớp Shape là mô ̣t lớp trừu tươ ̣ng có mô ̣t member function trừu tươ ̣ng là draw () Hai lớp Circle và Rectange thực hiê ̣n overload la ̣i hàm draw của lớp Shape với các chi tiế t cài đă ̣t khác chẳ ng ̣n với lớp Circle hàm draw sẽ vẽ mô ̣t vòng tròn còn với lớp Rectange thì sẽ vẽ mô ̣t hiǹ h chữ nhâ ̣t Và chúng ta có đoạn chương trình hợp lệ sau: int main() { Shape shape_list[4]; int choose; int i; for(i=0;i choose; if(choose==0) { shape_list[i] = new Circle(); }else{ shape_list[i] = new Rectange(); } } for(i=0;idraw(); } } Khi biên dich ̣ chương trình này thành mã thực hiê ̣n (file exe) trình biên dịch không thể xác đinh ̣ đươ ̣c mảng shape _list thì phầ n tử nào là Circle phầ n tử nào là Rec tange khơng thể xác định phiên hàm draw sẽ gọi thực Viê ̣c gọi tới phiên hàm draw để thực sẽ định thời điểm thực hiê ̣n chương triǹ h, sau đã biên dich ̣ điều gọi dynamic binding late binding Ngươ ̣c la ̣i nế u viê ̣c xác đinh ̣ phiên bản nào sẽ đươ ̣c go ̣i thực hiê ̣n tương ứng với dữ liê ̣u gắ n với nó đươ ̣c quyế t đinh static ̣ biên dich ̣ thì người ta go ̣i đó là binding Ví dụ cũng cung cấp cho chúng ta minh họa khả đa thể (polymorphism) Khái niệm đa thể dùng để khả thơng điệp đươ ̣c gửi tới cho các đố i tươ ̣ng của nhiề u lớp khác n hau ta ̣i thời điể m thực hiê ̣n chương trình Chúng ta thấy rõ lời gọi tới hàm draw sẽ gửi tới cho đối tượng hai lớp Circle và Rectange ta ̣i thời điể m chương trình đươ ̣c thực hiê ̣n Ngoài khái niệm OOP còn có thêm mô ̣t số khái niê ̣m khác chẳ ng ̣n name space và exception handling không phải là các khái niê ̣m bản chấ t Ngôn ngƣ̃ lâ ̣p trin ̀ h C++ OOP Giố ng bấ t kỳ mô ̣t ngôn ngữ nào của người , mô ̣t ngôn ngữ l ập trình phương tiê ̣n để diễn tả các khái niê ̣m , ý tưởng Viê ̣c phát triể n các chương trình hay phầ n mề m là quá triǹ h mô hiǹ h hóa các tra ̣ng thái tự nhiên của thế giới thực và xây dựng các chương triǹ h dựa các mơ hình Các chương trình thực chức mơ tả phương pháp cài đặt mơ hình Các hệ ngơn ngữ lập trình : Có thể phân chia hệ ngơn ngữ lập trình thành thế ̣: 1: vào năm 1954 – 1958 (Fortran I) với đă ̣c điể m là các biể u thức toán ho ̣c 2: vào năm 1959 – 1961 (Fortran II, Cobol) với các thủ tu ̣c 3: vào năm 1962 – 1970 (Pascal, Simula) với đă ̣c trưng là các khố i, lớp… 4: phát triể n chưa có dẫn chứng thực tế Các ngôn ngữ ngày cách xa ngơn ngữ máy trình biên dịch chúng ngày phải làm việc nhiều 3.1 Sƣ ̣ phát triể n của các ngôn ngƣ̃ lâ ̣p trin ̀ h hƣớng đố i tƣơ ̣ng 1967 Simula 1970 to 1983 Smalltalk 1979 Common LISP Object System 1980 Stroustrup starts on C++ 1981 Byte Smalltalk issue 1983 Objective C 1986 C++ 1987 Actor, Eiffel 1991 C++ release 3.0 1995 Java 1983 to 1989 Language books with OO concepts 1989 to 1992 Object-oriented design books 1992 to present Object-oriented methodology books Các ngơn ngữ lập trình khác Java Self Python Perl Prograph Modula Oberon Smalltalk Venders ParcPlace, Digitalk, Quasar Prolog++ Ada 9X Object Pascal (Delphi) Object X, X = fortran, cobal, etc C# Như vâ ̣y là có rấ t nhiề u ngôn ngữ lâ ̣p trình hướng đố i tươ ̣ng đã đời và chiế m ưu thế số chúng là C ++ Java Mỗi ngôn ngữ đề u có đă ̣c điể m riêng của nó và thić h hơ ̣p với các liñ h vực khác có lẽ C ++ ngôn ngữ cài đă ̣t nhiề u đă ̣c điể m của OOP nhấ t 3.2 Ngôn ngƣ̃ lâ ̣p trin ̀ h C++ C++ ngơn ngữ lập trình hướng đối tượng Bjarne Stroustrup (AT & T Bell Lab ) (giải thưởng ACM Grace Murray Hopper năm 1994) phát triển từ ngôn ngữ C C++ kế thừa cú pháp và mô ̣t số đă ̣c điể m ưu viê ̣t của C : ví dụ xử lý trỏ , thư viê ̣n hàm phong phú đa dạng , tính khả chuyển cao , chương triǹ h cha ̣y nhanh … Tuy nhiên về bản chấ t thì C++ khác hoàn toàn so với C, điề u này là C++ ngơn ngữ lập trình hướng đớ i tươ ̣ng Bài tập Bài tập 1: Download công cụ DevCpp từ Internet cài đặt máy tính mình, viết chương trình đầu tiên, thực biên dịch chạy thử Bài tập 2: Download công cụ Visual Studio từ website Microsoft cài đặt máy tính mình, viết chương trình, thực biên dịch chạy thử CHƢƠNG II: NHƢ̃ NG KHÁI NIỆM MỞ ĐẦU Chƣơng trin ̀ h đầ u tiên 1.1 Q trình biên dich ̣ mơ ̣t chƣơng trin ̀ h C++ Tấ t cả các ngôn ngữ máy tính đề u đươ ̣c dich ̣ từ mô ̣t da ̣ng nào đó mà người hiểu cách dễ dàng (các file mã nguồn viết bằng ngôn ngữ bậc cao) sang da ̣ng có th ể thực máy tính (các lệnh dạng ngơn ngữ máy ) Các chương trình thực trình chia thành hai dạng gọi tên trình thơng dich ̣ (interpreter) trình biên dịch (compiler) Trình thông dịch: Mô ̣t triǹ h thông dich ̣ sẽ dich ̣ mã nguồ n thành các hành đô ̣ng (activity), hành động bao gồm nhóm lệnh máy tiến hành thực hiê ̣n lâ ̣p tức các hành đô ̣ng này Ví dụ BASIC ngơn ng ữ điển hình cho ngơn ngữ thơng dich ̣ BASIC cổ điể n thông dich ̣ từng dòng lê ̣nh thực hiê ̣n và sau đó quên lâ ̣p tức dòng lê ̣nh vừa thông dich Điề u này làm cho quá trình thực hiê ̣n cả mô ̣t ̣ chương triǹ h châ ̣m vì bô ̣ thông di c̣ h phải tiế n hành dich ̣ la ̣i các đoa ̣n mã trùng lă ̣p BASIC ngày đã thêm vào qúa trình biên dịch để cải thiện tốc độ chương trình Các thông dich ̣ hiê ̣n đa ̣i chẳ ng ̣n Python , tiế n hành dich ̣ toàn bô ̣ chương trình qua mô ̣t ngôn ngữ trung gian sau đó thực hiê ̣n bằ ng mô ̣t bô ̣ thông dich Các ̣ nhanh rấ t nhiề u ngôn ngữ làm viê ̣c theo kiể u thông dich thươ ng co mô số chế nhấ t nh xây dự ng ̣ ̣t ̣n ̣ ̀ ́ dự án lớn (Có lẽ Python ngoại lệ ) Bô ̣ thông dich ̣ cầ n phải đươ ̣c lưu bô ̣ nhớ để thực hiê ̣n các mã chương triǹ h , chí thơng dịch có tốc độ nhanh cũng khơng thể cải thiện hồn tồn hạn chế tốc độ Hầu hế t các bô ̣ thông dich ̣ đề u yêu cầ u toàn bô ̣ mã nguồ n cầ n phải đươ ̣c thông dich ̣ mô ̣t lầ n nhấ t Điề u này không những dẫn đế n các ̣n chế về kić h thước của chương triǹ h mà còn tạo lỡi khó gỡ rối n gôn ngữ không cung cấ p các công cu ̣ hiê ̣u quả để xác đinh ̣ hiê ̣u ứng của các đoa ̣n mã khác Trình biên dịch : Mô ̣t triǹ h biên dich ̣ dich ̣ mã nguồ n trực tiế p thành ngôn ngữ assembly hoă ̣c các lê ̣nh máy Kế t quả cuố i cùng là mô ṭ file nhấ t hoă ̣c các file chứa các mã máy Đây là mô ̣t quá trình phức ta ̣p và đòi hỏi mơ ̣t vài bước Q trình chuyển đổi từ mã chương trình ban đầu thành mã thực tương đối dài trình biên dịch Tùy thuộc vào nhạy cảm người viết trình biên dịch , chương trình sinh mơ ̣t triǹ h biên dich ̣ có xu hướng đòi hỏi it́ bô ̣ nhớ thực hiê ̣n , chúng chạy nhanh rấ t nhiề u Mă ̣c dù kić h thước và tố c đô ̣ thường là các lý hàng đầ u cho viê ̣c sử du ̣ng mô ̣t trình biên dich ̣ , rấ t nhiề u trường hơ ̣p không phải là các lý quan tro ̣ng nhấ t Mô ̣t vài ngôn ngữ (chẳ ng ̣n C ) đươ ̣c thiế t kế để các phầ n tách biê ̣t của mô ̣t chương triǹ h có thể đươ ̣c biên dich ̣ đô ̣c lâ ̣p hoàn toàn với Các phần sau chí kết hợp thành chương trình thực cuối cơng cụ có tên trình liên kết Quá trình gọi separate compilation (biên dich ̣ ̣c lâ ̣p) Biên dịch độc lập có nhiều điểm lợi Mô ̣t chương trình nế u dich ̣ lâ ̣p tức toàn bô ̣ sẽ vươ ̣t giới hạn trình biên dịch hay mơi trường biên dịch biên d ịch theo từng phầ n Các chương trình xây dựng kiểm thử phần Nế u mo ̣t phầ n nào đó đã làm viê ̣c đúng đắ n nó có thể đươ ̣c lưu la ̣i là mô ̣t khố i đã hoàn thành Tâ ̣p các phầ n đã làm viê ̣c và đươ ̣c kiể m thử có thể kế t hơ ̣p la ̣i với ta ̣o thành các thư viê ̣n để các lâ ̣p trình viên khác có thể sử du ̣ng Các đặc điểm hỗ trợ cho việc tạo chương trình lớn Các đặc điểm gỡ lỗi trình biên dịch đã cải t iế n mơ ̣t cách đáng kể qua thời gian Các trình biên dịch sinh mã máy , lập trình viên phải chèn câu lê ̣nh in vào để xem thực sự chương trình làm gì Điề u này không phải lúc nào cũng hiệu Các trình biên dịch đại chèn thông tin mã nguồn vào mã thực hiê ̣n của chương triǹ h Thông tin này sẽ đươ ̣c sử du ̣ng bởi các bô ̣ gỡ lỗi cấ p đô ̣ nguồ n đầ y lực để chỉ chiń h xác điề u gì diễn tro ng mô ̣t chương triǹ h bằ ng cách theo dấ u (tracing) trình thực qua tồn mã nguồn Mơ ̣t vài trình biên dịch giải vấn đề tốc độ biên dịch bằng cách thực trình biên dịch nhớ (in-memory compilation) Các trình biên dịch theo kiểu lưu trình biên dịch bơ ̣ nhớ RAM Đối với chương trình nhỏ , q trình xem trình thơng dich ̣ Q trình biên dịch Để lâ ̣p trình bằ ng C và C ++ chúng t a cầ n phải hiể u các bước và các công cu ̣ q trình biên dịch Mơ ̣t vài ngôn ngữ (đă ̣c biê ̣t là C và C ++) bắ t đầ u thực hiê ̣n quá trình biên dich ̣ bằ ng cách cha ̣y mô ̣t bô ̣ tiề n xử lý đố i với mã nguồ n Bô ̣ tiề n xử lý là m ột chương trình đơn giản thay mẫu mã nguồn bằng mẫu khác mà lập trình viên đã đinh ̣ nghiã (sử du ̣ng các chỉ thi ̣tiề n xử lý : preprocessor directives) Các thị tiền xử lý sử dụng để tiết kiệ m viê ̣c gõ các đoa ̣n chương trình thường xuyên sử du ̣ng và tăng khả dễ đọc cho mã nguồn Tuy nhiên các chỉ thi tiề ̣ n xử lý này cũng gây những lỗi rấ t tinh vi và khó phát hiê ̣n Mã sinh tiền xử lý thường đươ ̣c ghi lên mô ̣t file ta ̣m Các trình biên dịch thường thực cơng việc theo hai pha Đầu tiên phân tích mã tiền xử lý Bơ ̣ biên dich ̣ chia mã tiề n xử lý thành các đơn vi ̣nhỏ và tổ chức chúng thành cấ u trúc go ̣i là Ví dụ biểu thức : “A+B” các phầ n tử “A” , “+”, “B” sẽ đươ ̣c lưu nút của phân tić h Mô ̣t bô ̣ tới ưu hóa toàn cu ̣c (global optimizer) cũng đươ ̣c sử du ̣ng để ta ̣o mã chương triǹ h nhỏ hơn, nhanh Trong pha thứ hai , bô ̣ sinh mã duyê ̣t qua phân tích và sinh hoă ̣c là mã assemble hoă ̣c mã máy cho các nút của Nế u bô ̣ sinh mã ta ̣o mã assembly , sau đó chương triǹ h dich ̣ mã assembler sẽ thực hiê ̣n côn g viê ̣c tiế p theo Kế t quả của hai trường hơ ̣p đề u là mô ̣t module object (mô ̣t file thường có đuôi là o hoă ̣c obj) Sau đó mô ̣t bô ̣ tố i ưu hoá nhỏ (peep-hole) sẽ sử dụng để loại bỏ đoạn chứa câu lệnh assembly thừa Viê ̣c sử du ̣ng từ “object” để mô tả các đoa ̣n mã máy là mô ̣t thực tế không đúng lắ m Từ này đã đươ ̣c dùng trước cả lâ ̣p triǹ h hướng đố i tươ ̣ng đời Từ “object” đươ ̣c sử du ̣ng có ý nghiã là từ “goal” nói về viê ̣c biên dich, ̣ đó lâ ̣p trình hướng đối tượng lại có nghĩa “a thing with boundaries” Trình liên kết kết hợp mô ̣t danh sách các module object thành mô ̣t chương trình thực hiê ̣n có thể na ̣p vào bô ̣ nhớ th ực hệ điều hành Khi mô ̣t hàm mô ̣t module object ta ̣o mô ̣t tham chiế u tới mô ̣t hàm hoă ̣c mô ̣t biế n mơ ̣t module object khác , trình liên kết sẽ xếp lại tham chiếu ; điề u này đảm bảo rằ ng tấ t cả c ác hàm liệu external sử dụng trình biên dịch tồn Trình liên kết cũng thêm vào module object đă ̣c biê ̣t để thực hiê ̣n các hành đô ̣ng khởi ̣ng Trình liên kết tìm kiếm file đă ̣c biê ̣t go ̣i là các thư viê ̣n để sắ p xế p la ̣i tấ t cả các tham chiế u tới chúng Mỗi thư viê ̣n chứa mô ̣t tâ ̣p các module object mô ̣t file Mô ̣t thư viê ̣n đươ ̣c ta ̣o và bảo trì bởi mô ̣t lâ ̣p triǹ h viên có tên là librarian Kiể m tra kiể u tinh ̃ 10 Trình biên dịch thực kiểm tra kiểu pha trình biên dịch Quá trình kiểm tra thực kiểm thử việc sử dụng tham số hàm ngăn chă ̣n rấ t nhiề u lỗi lâ ̣p trình k hác Vì trình kiểm tra kiểu thực qúa trình biên dịch khơng phải q trình chương trình thực nên gọi kiể m tra kiể u tiñ h Mô ̣t vài ngôn ngữ lâ ̣p triǹ h hướng đố i tươ ̣ng (Java chẳng hạn) thực hiê ̣n kiể m tra kiể u ta ̣i thời điể m chương trình cha ̣y (dynamic type checking) Nế u kế t hơ ̣p cả viê ̣c kiể m tra kiể u tiñ h và đô ̣ng thì sẽ hiê ̣u quả kiể m tra kiể u đô ̣ng cũng làm cho chương trình thực hiê ̣n bi ̣ả nh hưởng đôi chút C++ sử du ̣ng kiể m tra kiể u tiñ h Kiể m tra kiể u tiñ h báo cho lâ ̣p triǹ h viên về các lỗi về sử du ̣ng sai kiể u dữ liê ̣u quá triǹ h biên dịch, tối ưu hóa tốc độ thực chương trình Khi ho ̣c C++ chúng ta sẽ thấy hầu hế t các quyế t đinh ̣ thiế t kế của ngôn ngữ đề u tâ ̣p trung vào củng cố các đă ̣c điể m : tố c đô ̣ nhanh, hướng đố i tươ ̣ng, đặc điểm mà đã làm cho ngôn ngữ C trở nên tiếng Chúng ta có thể không dùn g tùy cho ̣n kiể m tra kiể u tiñ h của C ++ hoă ̣c cũng có thể thực hiê ̣n viê ̣c kiể m tra kiể u đô ̣ng - cần viết thêm mã Các công cụ cho việc biên dịch độc lập Viê ̣c biên dich ̣ đô ̣c lâ ̣p rấ t cầ n thiế t nhấ t là đố i với các dự án lớn Trong ngôn ngữ C C ++, mô ̣t lâ ̣p trình viên có thể ta ̣o các đoa ̣n chương trình nhỏ dễ quản lý và đươ ̣c kiể m thử đô ̣c lâ ̣p Công cu ̣ bản để chia mô ̣t chương triǹ h thành các phầ n nhỏ là khả ta ̣o các thay thế đươ ̣ c đă ̣t tên hay là các chương triǹ h Trong C và C ++ mô ̣t chương triǹ h đươ ̣c go ̣i là mô ̣t hàm , hàm đoạn mã thay các file khác , cho phép thực hiê ̣n quá trình biên dich ̣ ̣c lâ ̣p Nói mô ̣t cách khác hàm đơn vị ngun tử mã nguồn , chúng ta khơng thể đặt phần khác hàm file khác nên nội dung hàm cần phải đặt hoàn toàn file (mă ̣c dù các file có thể chứa nhiề u hàm) Khi chúng ta go ̣i đế n mô ̣t hàm , chúng ta thường truyền cho vài tham số , đó là giá trị mà chúng ta muốn hàm làm việc với thực Khi hàm thực hiê ̣n xong chúng ta thường nhâ ̣n đươ ̣c mô ̣t giá tri ̣trả về , mô ̣t giá tri ̣mà hàm trả la ̣i là mơ ̣t kế t quả Cũng viết hàm không nhận tham số không trả bất kỳ giá trị Để tạo chương trình với nhiều file , hàm mô ̣t file phải truy câ ̣p tới các hàm và dữ liê ̣u các file khác Khi biên dich ̣ mơ ̣t file , trình biên dịch C C ++ phải biết hàm liệu file khác đặc biệt tên cách dùng chúng Trình biên dịch đảm bảo các hàm và dữ liê ̣u đươ ̣c sử du ̣ng đúng đắ n Qúa trình báo cho trình biên dịch tên nguyên mẫu hàm liệu bên gọi khai báo (declaration) Khi chúng ta đã khai báo hàm biế n trình biên dich ̣ sẽ biế t cách thức kiể m tra để đảm bảo hàm liệu sử dụng đúng đắn Including các file Header Hầ u hế t các thư viê ̣n đề u chứa mô ̣t số lươ ̣ng đáng kể các hàm và biế n Để tiế t kiê ̣m công sứ c và đảm bảo sự nhấ t quán khai báo ngoài các phầ n tử này , C và C ++ đã sử dụng loại file gọi file header Mỗi file header là mơ ̣t file chứa các khai báo ngồi cho thư viê ̣n; theo qui ước các file này có phầ n mở rô ̣ng là h, chúng ta cũng dùng file khác cho chúng chẳng hạn hpp hoă ̣c hxx Lâ ̣p triǹ h viên ta ̣o các file thư viê ̣n sẽ cung cấ p các header file Để khai báo các hàm và các biế n bên ngoài thư viê ̣n người dùng đơn giản chỉ cầ n thực hiê ̣n include file header đó Để include mô ̣t file header chúng ta sử du ̣ng chỉ thi ̣tiề n xử lý #include Chỉ thị sẽ báo cho xử lý mở file 11 header có tên tương ứng và chèn nô ̣i dung của file đó vào chỗ mà chỉ thi ̣ #include đươ ̣c sử dụng Tên file sử du ̣ng sau chỉ thi ̣ #include có thể nằ m giữa hai dấ u < > hoă ̣c giữa hai dấ u “ Ví dụ: #include Nế u chúng ta sử du ̣ng chỉ thi ̣include theo cách thì b ộ tiền xử lý sẽ tìm file header theo cách đă ̣c thù đố i với cài đă ̣t của chúng ta , thường thì sẽ có mô ̣t vài đường dẫn mà chúng ta chỉ đinh ̣ cu ̣ thể biế n môi trường của trình biên dich ̣ hoă ̣c dòng lệnh để sử dụng cho việc tìm file header Cơ chế thiế t lâ ̣p các đường dẫn này phu ̣ thuô ̣c vào triǹ h biên dich ̣ và môi trường mà chúng ta làm viê ̣c Ví dụ: #include “header.h” Chỉ thị tiền xử lý thường có ý nghĩa báo cho bô ̣ tiề n xử lý tìm file tương ứng thư mục trước khơng thấy sẽ tìm giống trường hợp tên file include đươ ̣c đă ̣t giữa hai dấ u < > Nói chung file include chuẩn đươ ̣c sử du ̣ng nhiề u chúng ta nên đă ̣c nó thư mu ̣c mă ̣c đinh ̣ là include dưới thư mu ̣c cài đặt trình biên dịch dùng thị theo kiểu , còn file đặc thù với ứng dụng cụ thể dùng kiểu tên file đặt hai dấu “” Trong quá trình phát triể n của C ++ nhà cung cấp trình biên dịch có qui ước đặt tên khác hệ điều hành lại có hạn chế tên khác đặc biệt độ dài tên file Các vấn đề gây vấ n đề về tiń h khả chuyể n của chương triǹ h Để khắ c phu ̣c vấ n đề này người ta đã sử du ̣ng mô ̣t đinh ̣ da ̣ng chuẩ n cho phép các tên file header có thể dài ký tự bỏ phần tên mở rô ̣ng Để phân biê ̣t mô ̣t chương trình C và C ++ người ta còn dùng cách thêm mô ̣t ký tự “c” vào trước tên của các file header , chi tiế t này cũng đươ ̣c chấ p nhâ ̣n đố i với C C++ Quá trình liên kết Trình liên kết tập hợp module object (thường là các file có phần mở rộng o hoă ̣c obj), đươ ̣c sinh bởi trình biên dich ̣ , thành chương trình thực hệ điều hành nạp vào nhớ chạy Đây là pha cuố i cùng quá trình biên dịch Các đặc đ iể m của các triǹ h liên kế t thay đổ i phu ̣ thuô ̣c vào các ̣ thớ ng khác Nói chung chúng ta cần rõ cho trình liên kết biết tên module object thư viê ̣n mà chúng ta muố n liên kế t , tên chương trì nh khả cha ̣y ć i cùng Mô ̣t vài ̣ thố ng đòi hỏi chúng ta cầ n phải tự go ̣i tới các trình liên kế t Tuy nhiên hầ u hế t các trình biên dich ̣ hoàn chỉnh đề u thực hiê ̣n hô ̣ chúng ta công viê ̣c này Sƣ̉ du ̣ng các thƣ viêṇ Giờ ch úng ta đã biết thuật ngữ , chúng ta hiểu cách thức sử dụng thư viện Để sử du ̣ng mô ̣t thư viê ̣n cầ n phải : + Include file header của thư viê ̣n + Sử du ̣ng các hàm và các biế n thư viê ̣n + Liên kế t thư viện vào chương trình khả chạy cuối Các bước cũng đúng với module object thư viện Including mơ ̣t file header và liên kế t các module object là các bước bản để thực hiê ̣n viê ̣c biên dich ̣ đô ̣c lâ ̣p C và C++ 12 Trình liên kết làm để tìm file thƣ viện Khi chúng ta ta ̣o mô ̣t tham chiế u ngoài tới mô ̣t hàm số hoă ̣c mô ̣t biế n số C hoă ̣c C++, trình liên kết , bắ t gă ̣p tham chiế u này , thực mộ t hai viê ̣c sau: nế u nó chưa thấ y phầ n đinh ̣ nghiã của hàm hay biế n này , sẽ thêm định danh vào danh sách các tham chiế u chưa đươ ̣c đinh ̣ nghiã của nó Nế u trình liên kế t đã bắ t gă ̣p đinh ̣ nghiã của tham chiế u đó , tham chiế u sẽ đươ ̣c sắ p xế p la ̣i Nế u triǹ h liên kế t không tim ̣ nghiã của tham chiế u danh sách các module object nó sẽ tiế n ̀ thấ y đinh hành tìm kiếm thư viện Các thư viện có vài loại số nên trình li ên kế t không cầ n thiế t phải tìm kiế m hế t các module objetc của thư viê ̣n – cần xem xét phần mục Khi trình liên kế t tìm thấ y mô ̣t đinh ̣ nghiã mô ̣t thư viê ̣n , tồn bơ ̣ module object chứ khơng chỉ phầ n ̣ nh nghiã của hàm , sẽ liên kết vào chương trình thực Chú ý rằng tồn thư viện sẽ khơng liên kết , có phần định nghĩa mà chương trình tham chiếu tới Như vâ ̣y nế u chúng ta muố n tố i ưu về kić h thước củ a chương trình chúng ta có thể cho mỗi hàm vào mô ̣t file xây dựng các thư viê ̣n riêng của Điề u này đòi hỏi công sức edit nhiề u cũng có thể có ích Vì trình liên kết tìm kiếm file theo thứ tự chúng ta c ó thể che tồn hàm thư viện bằng cách dùng hàm chúng ta với phần định nghĩa prototype y hệt hàm thư viện Tuy nhiên điề u này cũng có thế gây các lỗi mà chúng ta không thể kiể m soát đươ ̣c Khi mô ̣t chương triǹ h khả cha ̣y đươ ̣c viế t bằ ng C hoă ̣c C ++ đươ ̣c ta ̣o , mô ̣t số các thành phần định sẽ liên kết với cách bí mật Mơ ̣t các thành phầ n module khởi động (startup), module này chứ a các thủ tu ̣c khởi ta ̣o cầ n phải đươ ̣c thực hiê ̣n bấ t cứ nào mô ̣t chương trình C hay C ++ bắ t đầ u cha ̣y Các thủ tục thiế t lâ ̣p stack và các biế n khởi ta ̣o nhấ t đinh ̣ chương triǹ h Trình biên dịch ln thực vi ệc tìm kiếm thư viện chuẩn để thực liên kế t các hàm chuẩ n mà chúng ta dùng chương trình nên để dùng các hàm thư viện chuẩn chúng ta đơn giản cần include file header thư viện Còn đối với các thư viê ̣n riêng chúng ta ta ̣o chúng ta cầ n chỉ rõ tên thư viê ̣n cho triǹ h liên kế t (chẳ ng ̣n thư viê ̣n graphics không phải là mô ̣t thư viê ̣n chuẩ n ) 1.2 Chƣơng trin ̀ h đầ u tiên Cách tốt để học lập trình xem chương trình người khác viết học tập kỹ thuật lập trình họ Sau là chương triǹ h HelloWorld đươ ̣c viế t bằ ng C ++, mô ̣t chương triǹ h mà hầ u hế t các sách lâ ̣p triǹ h đề u lấ y làm ví du ̣ mở đầ u // Chương trình HelloWorld // File hello.cpp // In màn hiǹ h xâu “Hello, World!” #include // Khai báo luồ ng cout để sử du ̣ng int main() { cout

Ngày đăng: 15/04/2020, 16:12

w