Lập trình hướng đối tượng
Lập trình hớng đối tợng với C++Mục lục Mục lục .1 lời nói đầu .5chơng 1: Mở đầu 6Bài 1. So sánh giữa lập trình hớng đối tợng và lập trình hớng thủ tục 61. Lập trình hớng thủ tục .62. Lập trình hớng đối tợng .7Bài 2. Giới thiệu ngôn ngữ C++ 91. Chú thích trong C và trong C++ .92. Các từ khóa mới .93. Phép chuyển kiểu bắt buộc 104. Khai báo biến 105. Hàm main 116. Truyền tham số cho hàm .117. Nhắc lại về biến con trỏ .158. Sử dụng tham số truyền ngầm định trong hàm. .179. Cấp phát và giải phóng bộ nhớ .1910. Các hàm tải bội (Overloaded function) 2011. Hàm inline .2212. Khả năng vào ra mới của C++ 26Bài 3. Một số khái niệm cơ bản của lập trình h-ớng đối tợng .301. Khái niệm đối tợng (Object) 302. Lớp đối tợng (Class) .303. Trừu tợng hoá dữ liệu và bao gói thông tin (Abstraction and Encapsulation) 304. Sự kế thừa (Inheritance) 315. Sự đa hình và sự tải bội (Polymorphism and Oveloading) 33 Lập trình hớng đối tợng với C++chơng 2: Lớp các đối tợng 37Bài 1. lớp các đối tợng .371. Khai báo lớp các đối tợng .372. Các thành phần trong lớp (Data member and function member) 413. Đối tợng trong tham số của hàm .52Bài 2. Constructor và destructor .56Bài 3. Toán tử tải bội và toán tử tải bội thân thiện 601. Khái quát chung .602. Toán tử tải bội 603. Bài tập 1 .654. Toán tử tải bội thân thiện 665. Bài tập 2 .756. Chuyển đổi kiểu 76Bài 4. Vài vấn đề về sử dụng từ khoá const 841. Sử dụng biến kiểu const 842. Truyền tham số kiểu const cho hàm .853. Đối tợng hằng của lớp .874. Hàm thành phần const (hàm thành phần có khai báo const phía sau) 895. Con trỏ this kiểu const (hàm thành phần có khai báo const phía trớc) .926. Lớp các dãy bit 947. Nghiên cứu lớp lớp String 98chơng 3: Sự kế thừa - inheritance .105Bài 1. Sự tơng ứng trong kế thừa 1051. Khái niệm chung .1052 Nguyễn Văn Tân 2. Kế thừa đơn .1063. Thành phần protected trong kế thừa .1084. Kế thừa đa mức 1135. Kế thừa phân cấp .1146. Kế thừa bội .1147. Kế thừa kép (lai ghép) 1168. Constructor trong các lớp kế thừa 120Bài 2. Con trỏ xác định thành phần của lớp và con trỏ xác định đối tợng .1241. Các ký hiệu cú pháp về con trỏ .1242. Các ví dụ 1253. Con trỏ xác định đối tợng 127Bài 3. Hàm ảo và tơng ứng bội trong kế thừa .1321. Các hàm dịch chuyển (Override function) 1322. Con trỏ xác định đối tợng trong quan hệ kế thừa .1333. Con trỏ hàm ảo và tơng ứng bội 1354. Kế thừa lai ghép và lớp cơ sở ảo 1385. Hàm rỗng (Null Function) .1416. Hàm ảo thực sự và lớp trừu tợng (pure function & abstract class) .1427. Hàm thân thiện ảo và toán tử ảo dịch chuyển 144chơng 4: lớp mẫu và hàm mẫu .145 Khái quát 1451. Hàm mẫu .1452. Lớp mẫu 148 Phụ lục - Giới thiệu Một số bài toán phân tích thiết kế hớng đối tợng trên C++ .1543 Lập trình hớng đối tợng với C++1. Sơ lợc 5 bớc thực hiện .1542. Xây dựng lớp hình học phẳng .1553. Quản lý các lô đất .165 Tài liệu tham khảo .1744 Nguyễn Văn Tân lời nói đầuTrong những năm 1980, ngôn ngữ C đã khẳng định đợc vị trí quan trọng trong các ngôn ngữ lập trình có cấu trúc bởi tính đa năng của mình. Tuy nhiên khi độ phức tạp của bài toán khá lớn thì C không còn đáp ứng đợc đối với các dự án lớn. Cần phải thiết kế những phần mềm mang những đợc những đặc tính của thế giới thực bên bên ngoài. Kỹ thuật lập trình xuất phát trên ý tởng này mang tên là là kỹ thuật lập trình hớng đối tợng (Object Oriented Programing viết tắt là OOP) và trên kỹ thuật này nhiều trình biên dịch đã đợc thiết kế nh Smalltalk, C++ .Lập trình hớng đối tợng đợc phát triển từ ngôn ngữ lập trình có cấu trúc nhng thay vì xoay quanh chức năng của nhiệm vụ đã đặt ra, lập trình hớng đối tợng lại đặt trọng tâm vào việc xử lý các dữ liệu để thực hiện các chức năng đó. Trong lập trình hớng đối tợng, khái niệm về đối t-ợng (Object) trở thành một khái niệm trọng tâm và hầu nhmọi công việc trong một chơng trình đều đợc tiến hành trên các đối tợng này.Những vấn đề trọng tâm và mới mẻ của lập trình h-ớng đối tợng với C++ mà chúng ta cần phải tập trung nghiên cứu là: Sự bao gói (Encapsulation) Sự kế thừa (Inheritance) Sự tơng ứng bội (Polymorphism)5 Lập trình hớng đối tợng với C++chơng 1:Mở đầuBài 1. So sánh giữa lập trình hớng đối t-ợng và lập trình hớng thủ tục1. Lập trình hớng thủ tục* Theo cách tiếp cận truyền thống của lập trình h-ớng thủ tục thì chơng trình đợc xem nh dãy các công việc cần thực hiện: Nhập dữ liệu, Xử lý dữ liệu, Tính toán, Lập báo cáo, In kết quả .* Vậy trọng tâm của lập trình hớng thủ tục là phân rã bài toán thành các hàm chức năng theo kỹ thuật top-down. Bài toán đợc giải quyết bởi một số hàm chính. Các hàm chính lại có thể phân chia thành các bài toán con - tức là các hàm chức năng nhỏ hơn nữa. Một số hàm có thể gọi thực hiện (dùng chung) một số hàm chức năng nhỏ hơn. Nh vậy, cấu trúc các hàm của một chơng trình lập trình h-ớng thủ tục là cấu trúc phân cấp các hàm: * Việc chú ý tới các hàm trong chơng trình sẽ không quan tâm nhiều đến dữ liệu. Dữ liệu của toàn bộ chơng trình đợc các hàm dùng chung và biến đổi từ hàm này sang hàm khác. Bản thân trong các hàm cũng có dữ liệu riêng. 6mainHàm1 Hàm2 Hàm3Hàm4Hàm5 Hàm6 Hàm7 Hàm8 Nguyễn Văn Tân * Vậy đặc trng của lập trình hớng thủ tục là 1. Tập trung vào công việc cần thực hiện - thuật toán.2. Chơng trình đợc chia thành các hàm nhỏ.3. Phần lớn các hàm dùng chung dữ liệu.4. Dữ liệu trong chơng trình chuyển động từ hàm này sang hàm khác.5. Hàm biến đổi dữ liệu từ dạng này sang dạng khác.6. Thiết kế chơng trình theo kỹ thuật top-down2. Lập trình hớng đối tợng* Lập trình hớng đối tợng đặt trọng tâm vào đối tợng và không cho dữ liệu chuyển động trong hệ thống. Dữ liệu gắn chặt vào các hàm và thủ tục tạo thành một vùng riêng và không cho các hàm bên ngoài truy nhập một cách tuỳ tiện.* Lập trình hớng đối tợng phân tích bài toán thành các thực thể gọi là đối tợng, sau đó xây dựng các hàm xung quanh đối tợng đó.* Dữ liệu của đối tợng chỉ có thể truy nhập đợc bởi các hàm của đối tợng. Chỉ có một số hàm của đối tợng này có thể gọi thực hiện các hàm của đối tợng khác biểu thị sự trao đổi thông báo giữa các đối tợng.7Dữ liệu chungDữ liệu chungHàm 1Dữ liệu riêng 1Hàm 2Dữ liệu riêng 2Hàm 3Dữ liệu riêng 3Đối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàm Lập trình hớng đối tợng với Ctài liệu lập trình hướng đối tượng với c'>liệu riêng 3Đối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàm Lập trình hớng đối tợng với C++* Nh vậy đặc trng của lập trình hớng đối tợng là:1. Tập trung vào dữ liệu thay cho hàm.2. Chia chơng trình thành các đối tợng.3. Dữ liệu đợc thiết kế sao cho đặc tả đợc đối tợng.4. Các hàm đợc xây dựng trên các vùng dữ liệu của đối tợng và đợc gắn liền với nhau trên cấu trúc dữ liệu đó.5. Dữ liệu đợc bao bọc, che dấu không cho các hàm ngoại lai truy nhập.6. Các đối tợng trao đổi thông báo với nhau thông qua các hàm.7. Dữ liệu và các hàm dễ dàng bổ sung vào đối tợng.8. Chơng trình đợc thiết kế theo kỹ thuật botom up.8 Nguyễn Văn Tân Bài 2. Giới thiệu ngôn ngữ C++Trong bài này: với mục đích so sánh ngôn ngữ C và C++ sẽ làm rõ một số đặc điểm mạnh của C++ so với C, đồng thời nhấn mạnh thêm hoặc giải thích chi tiết một số vấn đề quan trọng, thờng gặp khi lập trình với C++.1. Chú thích trong C và trong C++Trớc hết C++ đợc phát triển từ C nên nó vẫn sử dụng lại tất cả các cú pháp ngôn ngữ nh C và bổ sung thêm một số cú pháp mới.C++ đa ra một kiểu chú thích mới để tiện chú thích trên một dòng nếu dùng ký pháp // và cũng tiện để viết trên nhiều dòng liên tục nếu dùng cặp ký pháp /* . */Chú thích trong C Chú thích trong C++/* dong 1 chu thich cua C *//* dong 2 chu thich cua C */x=y=0; /*chu thich sau lenh *//* Bat dau chu thich Dong 2 chu thichKet thuc chu thich */x=y=10; // chu thich sau lenh2. Các từ khóa mới C++ bổ sung vào C một số từ khóa mới asmfriend newprotectedthiscatchoperatorinlinevirtualclasspublicprivatecdeclpascaldeletetempled9 Lập trình hớng đối tợng với C++3. Phép chuyển kiểu bắt buộcNgoài phép chuyển kiểu nh trong ngôn ngữ C, C++ còn đa ra phép chuyển kiểu mới. Xét ví dụ sau đây: int x=0;long z=(long)x; // chuyen kieu cua Clong z=long(x); // chuyen kieu cua C++Nh vậy phép chuyển kiểu trong C++ có dạng nh một hàm số chuyển kiểu đang đợc gọi. Cách chuyển kiểu này rõ ràng vừa khoa học vừa dễ dọc.4. Khai báo biếnNhìn chung phạm vi hoạt động của biến phụ thuộc vào kiểu của biến và vị trí khai báo của biến trong chơng trình.Ngôn ngữ C đòi hỏi phải khai báo biến trớc phạm vi mà các biến đang sử dụng. Cách khai báo đơn giản nhất trong C là khai báo biến toàn cục lên trớc tất cả các hàm và khai báo biến cục bộ ở đầu thân từng hàm.Trong C++, khác với C, cho phép một cách khai báo biến mới, với cách khai báo này, một biến có thể khai báo ở vị trí bất kỳ miễn sao là trớc khi sử dụng nó, phạm vi hoạt động của biến trong trờng hợp này là trong khối nơi biến đó đợc khai báo.Ví dụ 1: Khai báo sau đây trong C ++ chấp nhận nh-ng trong C là lỗi vì C yêu cầu khai báo biến trớc lệnh.clrscr();int x; Ví dụ 2:void simple(){ int n; // khai bao cuc bo for(int i=0; i<10; i++) // cho phep khai bao i trong for { int m; if (i&1) n+=110 [...]... mong muốn 29 Lập trình hớng đối tợng với C++ Bài 3 Một số khái niệm cơ bản của lập trình hớng đối tợng 1 Khái niệm đối tợng (Object) Đối tợng là mô hình của thực thể, bao gồm: - Thông tin mô tả đối tợng (dữ liệu), gọi là trạng thái (status) của đối tợng - Các hàm tác động lên đối tợng làm thay đổi trạng thái của đối tợng, gọi là phơng thức (method) của đối tợng Dữ liệu và các hàm của đối tợng gắn liền... tính chung nhất của các đối tợng có cùng một bản chất, bỏ qua những thông tin chi tiết của từng đối tợng riêng lẻ Trong lập trình, lớp đợc sử dụng nh kiểu dữ liệu trừu tợng và nâng lên mức khuôn mẫu lớp Phơng pháp lập trình hớng đối tợng bao gồm cả trừu tợng hoá dữ liệu và trừu tợng hoá chức năng 4 Sự kế thừa (Inheritance) 4.1 Khái niệm sự kế thừa - Sự kế thừa là quá trình mà các đối tợng của lớp này... Late Binding) Trong chơng trình hớng đối tợng với C++, cần phải trả lời câu hỏi: Một con trỏ đối tợng sẽ liên kết với hàm nào trong các lớp có quan hệ kế thừa mà các hàm này có chung đặc tính? 35 Lập trình hớng đối tợng với C++ - Nếu mối liên kết giữa đối tợng với hàm đó đã có thể xác định đợc ngay từ khi dịch chơng trình và sẽ không thay đổi trong suốt thời gian chạy chơng trình thì đợc gọi là liên... (trong thời gian dịch chơng trình) và liên kết động (trong thời gian chạy chơng trình) Và, từ đây ta sẽ lý giải rõ các khái niệm vừa trình bầy Tơng ứng bội đóng vai trò quan trọng trong việc tạo ra các đối tợng có cấu trúc bên trong khác nhau nhng có khả năng cùng dùng chung một giao diện bên ngoài (nh tên gọi) Điều này có nghĩa là một lớp tổng quát các phép toán 33 Lập trình hớng đối tợng với C++ đợc định... (3+5) (2) Khi định nghĩa một macro nh một đoạn chơng trình thì phải viết đoạn chơng trình trong khối lệnh { } Ví dụ 4: #define Check { printf("\nStop ! "); exit(1); } void main(){ if (x > MAX_VALUE) Check; } b)Macro định nghĩa hàm 23 Lập trình hớng đối tợng với C++ Có thể dùng macro có đối để định nghĩa hàm Khi đó có một số điểm chú ý sau đây: - Đối của macro có thể không cần khai báo kiểu cụ thể... nhiên ta sẽ gọi là a là một đối tợng của lớp A và lệnh này gọi là lệnh tạo lập đối tợng 3 Trừu tợng hoá dữ liệu và bao gói thông tin (Abstraction and Encapsulation) - Việc đóng gói dữ liệu và các hàm gắn với nó vào một đơn vị cấu trúc (tức là một lớp các đối tợng) đợc xem nh một nguyên tắc bao gói thông tin Nguyên tắc bao gói dữ liệu ngăn cấm sự truy nhập trực tiếp trong lập trình gọi là sự che dấu thông... truyền tham số theo con trỏ và theo tham chiếu là truyền cho hàm địa chỉ của đối chứ không phải là bản sao của đối Vậy các giá trị của đối bị hàm thay đổi cũng sẽ đợc giữ lại khi ra khỏi hàm Ví dụ 3 (thso3.cpp) #include #include void swap(int &,int &); void main() { 13 Kết quả x = 5 y=10 Lập trình hớng đối tợng với C++ int x=10,y=5; clrscr(); swap(x,y); printf("x=%d y=%d\n",x,y);... dãy lệnh mã máy tại chỗ gọi nó trong chơng trình lúc thực hiện Ưu điểm của macro và inline là ở chỗ nó cho phép trình bầy chơng trình ngắn gọn và quan trọng là cho phép thực hiện nhanh hơn các hàm thông thờng Bởi vì mỗi lần gọi hàm inline (hoặc macro), trình biên dịch sẽ ghép trực 24 Nguyễn Văn Tân tiếp câu lệnh mã máy của nó tại vị trí gọi nó trong chơng trình (mã máy) lúc thực hiện và không đòi hỏi... theo các lỗi khi thực hiện chơng trình 6 Truyền tham số cho hàm C++ vẫn sử dụng 2 cách truyền tham số cho hàm trong C là truyền theo giá trị và truyền theo con trỏ Tuy nhiên, C++ có thêm một cách mới để truyền tham số cho hàm là truyền tham số kiểu tham chiếu Cách mới này rất hay sử dụng vì thích hợp truyền tham số cho 11 Lập trình hớng đối tợng với C++ hàm là địa chỉ của đối tợng - một kiểu dữ liệu mới... đối tợng, gọi là phơng thức (method) của đối tợng Dữ liệu và các hàm của đối tợng gắn liền với nhau để đặc tả đối tợng Đối tợng bao gồm cả sự vật, hiện tợng và các khái niệm 2 Lớp đối tợng (Class) - Các đối tợng có cùng thành phần dữ liệu và phơng thức hình thành lên một lớp Vậy có thể xem đối tợng là một thể hiện của lớp - Lớp là kiểu dữ liệu đợc định nghĩa bởi ngời dùng nên nó cũng có các tính chất . riêng 3Đối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàmĐối tượng ADữ liệuCác hàm Lập trình hớng đối tợng với C++* Nh vậy đặc trng của lập trình hớng đối. (Polymorphism)5 Lập trình hớng đối tợng với C++chơng 1:Mở đầuBài 1. So sánh giữa lập trình hớng đối t-ợng và lập trình hớng thủ tục1. Lập trình hớng thủ