Lập trình hướng đối tượng với C++ - Chương 1: Lập trình hướng đối tượng, phương pháp giải quyết bài toán mới
Ngôn ngữ C++
Lập trình hướng đối tượng
1.Phương pháp lập trình 1
2.Bài toán quan hệ gia đình 2
3.Lập trình hướng đối tượng 6
3.1Một số khái niệm 7
3.2Các ưu điểm của LTHĐT 8
3.3Những ứng dụng của LTHĐT 9
4.Các ngôn ngữ lập trình hướng đối tượng 9
5.Ngôn ngữ lập trình C++ 10
thấy sự đóng gói thực sự về dữ liệu chỉ có trong một ngôn ngữ LTHĐT “thuần khiết” (pure) theo nghĩa các ngôn ngữ được thiết kế ngay từ đầu chỉ cho LTHĐT. Còn đối với các ngôn ngữ “lai” (hybrid) được xây dựng trên các ngôn ngữ khác ban đầu chưa phải là HĐT như C++ được nói đến trong cuốn sách này, vẫn có những ngoại lệ nhất định vi phạm nguyên tắc đóng gói dữ liệu. Tính kế thừa (inheritance) Một khái niệm quan trọng của LTHĐT là sự kế thừa. Sự kế thừa cho phép chúng ta định nghĩa một lớp mới trên cơ sở các lớp đã tồn tại, tất nhiên có bổ sung những phương thức hay các thành phần dữ liệu mới. Khả năng kế thừa cho phép chúng ta sử dụng lại một cách dễ dàng các module chương trình mà không cần một thay đổi các module đó. Rõ ràng đây là một điểm mạnh của LTHĐT so với LTCT. Tính đa hình (polymorphime) Tính đa hình xuất hiện khi có khái niệm kế thừa. Giả sử chúng ta có một kế thừa lớp hình tứ giác và lớp hình tam giác kế thừa từ lớp hình đa giác (hình tam giác và tứ giác sẽ có đầy đủ các thuộc tính và tính chất của một hình đa giác). Lúc này một đối tượng thuộc lớp hình tam giác hay tứ giác đều có thể hiểu rằng nó là một hình đa giác. Mặt khác với mỗi đa giác ta có thể tính diện tích của nó. Như vậy làm thế nào mà một đa giác có thể sử dụng đúng công thức để tính diện tích phù hợp với nó là hình tam giác hay tứ giác. Ta gọi đó là tính đa hình. Các ưu điểm của LTHĐT LTHĐT đem lại một số lợi thế cho người thiết kế lẫn người lập trình. Cách tiếp cận hướng đối tượng giải quyết được nhiều vấn đề tồn tại trong quá trình phát triển phần mềm và tạo ra được những phần mềm có độ phức tạp và chất lượng cao. Phương pháp này mở ra một triển vọng to lớn cho người lập trình. Những ưu điểm chính của LTHĐT là: Thông qua nguyên lý kế thừa, chúng ta có thể loại bỏ được những đoạn chương trình lặp lại trong quá trình mô tả các lớp và có thể mở rộng khả năng sử dụng của các lớp đã xây dựng mà không cần phải viết lại. Chương trình được xây dựng từ những đơn thể (đối tượng) trao đổi với nhau nên việc thiết kế và lập trình sẽ được thực hiện theo quy trình nhất định chứ không phải dựa vào kinh nghiệm và kỹ thuật như trước nữa. Điều này đảm bảo rút ngắn được thời gian xây dựng hệ thống và tăng năng suất lao động. Nguyên lý đóng gói hay che giấu thông tin giúp người lập trình tạo ra được những chương trình an toàn không bị thay đổi bởi những đoạn chương trình khác. Có thể xây dựng được ánh xạ các đối tượng của bài toán vào đối tượng chương trình. Cách tiếp cận thiết kế đặt trọng tâm vào dữ liệu, giúp chúng ta xây dựng được mô hình chi tiết và dễ dàng cài đặt hơn. Các hệ thống hướng đối tượng dễ mở rộng, nâng cấp thành những hệ lớn hơn. Kỹ thuật truyền thông báo trong việc trao đổi thông tin giữa các đối tượng làm cho việc mô tả giao diện với các hệ thống bên ngoài trở nên đơn giản hơn. Có thể quản lý được độ phức tạp của những sản phẩm phần mềm. Những ứng dụng của LTHĐT LTHĐT là một trong những thuật ngữ được nhắc đến nhiều nhất hiện nay trong công nghệ phần mềm và nó được ứng dụng để phát triển phần mềm trong nhiều lĩnh vực khác nhau. Trong số đó, ứng dụng quan trọng và nổi tiếng nhất hiện nay là thiết kế giao diện với người sử dụng, kiểu như Windows. Các hệ thông tin quản lý trong thực tế thường rất phức tạp, chứa nhiều đối tượng với các thuộc tính và hàm phức tạp. Để giải quyết những hệ thông tin phức tạp như thế, LTHĐT tỏ ra rất hiệu quả. Các lĩnh vực ứng dụng phù hợp với kỹ thuật LTHĐT có thể liệt kê như dưới đây: Các hệ thống làm việc theo thời gian thực. Các hệ mô hình hoá hoặc mô phỏng các quá trình. Các hệ cơ sở dữ liệu hướng đối tượng. Các hệ siêu văn bản (hypertext), đa phương tiện (multimedia). Các hệ thống trí tuệ nhân tạo và các hệ chuyên gia. Các hệ thống song song và mạng nơ-ron. Các hệ tự động hoá văn phòng hoặc trợ giúp quyết định. Các hệ CAD/CAM. Với nhiều đặc tính phong phú của LTHĐT nói riêng, của phương pháp phân tích thiết kế và phát triển hướng đối tượng nói chung chúng ta hy vọng công nghiệp phần mềm sẽ có những cải tiến nhảy vọt không những về chất lượng, mà còn gia tăng nhanh về số lượng trong tương lai. Các ngôn ngữ lập trình hướng đối tượng LTHĐT không phải là đặc quyền của một ngôn ngữ đặc biệt nào. Cũng giống như kỹ thuật lập trình có cấu trúc, các khái niệm trong LTHĐT được thể hiện trong nhiều ngôn ngữ lập trình khác nhau. Những ngôn ngữ cung cấp được những khả năng LTHĐT được gọi là ngôn ngữ lập trình hướng đối tượng. Tuy vẫn có những ngôn ngữ chỉ cung cấp khả năng tạo lớp và đối tượng mà không cho phép kế thừa, do đó hạn chế khả năng LTHĐT. Hình 1.7 cho chúng ta một cái nhìn tổng quan về sự phát triển các ngôn ngữ LTHĐT. SIMULA (66) SMALLTALK (71) SMALLTALK (80) ADA (83) C++ (86) EIFFEL (90) JAVA (95) ADA (95) Hình 1.7 Sự phát triển của các ngôn ngữ LTHĐT Các ngôn ngữ SIMULA, SMALLTALK, JAVA thuộc họ ngôn ngữ LTHĐT thuần khiết, nghĩa là nó không cho phép phát triển các chương trình cấu trúc trên các ngôn ngữ loại này. Còn ngôn ngữ C++ thuộc loại ngôn ngữ “lai” bởi vì nó được phát triển từ ngôn ngữ C. Do đó trên C++ vẫn có thể sử dụng tính cấu trúc và đối tượng của chương trình. Điều này tỏ ra rất phù hợp khi chúng ta mới bắt đầu học một ngôn ngữ lập trình. Đó chính là lý do mà chúng tôi sử dụng ngôn ngữ C++ để giới thiệu phương pháp LTHĐT trong cuốn sách này. Một lý do khác nữa là C++ sử dụng cú pháp của ngôn ngữ C là ngôn ngữ rất thông dụng trong lập trình chuyên nghiệp. Ngôn ngữ lập trình C++ Vào năm 1983, giáo sư Bjarne Stroustrap bắt đầu nghiên cứu và phát triển việc cài đặt khả năng LTHĐT vào ngôn ngữ C tạo ra một ngôn ngữ mới gọi là C++. Tên gọi này có thể phân tích ý nghĩa rằng nó là ngôn ngữ C mà có hai đặc điểm mới tương ứng với hai dấu cộng. Đặc điểm thứ nhất là một số khả năng mở rộng so với C như tham chiếu, chồng hàm, tham số mặc định... Đặc điểm thứ hai chính là khả năng LTHĐT. Hiện nay C++ chưa phải là một ngôn ngữ hoàn toàn ổn định. Kể từ khi phiên bản đầu tiên ra đời vào năm 1986 đã có rất nhiều thay đổi trong các phiên bản C++ khác nhau: bản 1.1 ra đời vào năm 1986, 2.0 vào năm 1989 và 3.0 vào năm 1991. Phiên bản 3.0 này được sử dụng để làm cơ sở cho việc định nghĩa một ngôn ngữ C++ chuẩn (kiểu như Ansi C). Trên thực tế hiện nay tất cả các chương trình dịch C++ đều tương thích với phiên bản 3.0. Vì vậy C++ hầu như không gây bất kỳ một khó khăn nào khi chuyển đổi từ một môi trường này sang môi trường khác, như chúng ta đã biết C++ như là một sự bổ sung khả năng LTHĐT vào ngôn ngữ C. Sẽ có nhiều người nghĩ rằng ngôn ngữ C nói ở đây là C theo chuẩn ANSI. Thực ra không phải hoàn toàn như vậy. Tên thực tế vẫn tồn tại một vài điểm không tương thích giữa ANSI C và C++. Mặt khác cũng cần thấy rằng những mở rộng có trong C++ so với Ansi C không chỉ là để phục vụ cho mục đích tạo cho ngôn ngữ khả năng LTHĐT. Có những thay đổi chỉ với mục đích đơn thuần là tăng sức mạnh cho ngôn ngữ C hiện thời. Ngoài ra có một vài thay đổi nhỏ ở C++ so với ANSI C như sau: Định nghĩa các hàm: khai báo, truyền tham số và giá trị trả lại. Sự tương thích giữa các con trỏ. Tính linh hoạt của các hằng (const). Các đặc điểm mở rộng trong C++ Như đã đề cập ở trên C++ chứa cả những mở rộng so với C mà không liên quan đến kỹ thuật hướng đối tượng. Những mở rộng này sẽ được mô tả cụ thể trong chương sau, ở đây chúng ta chỉ tóm tắt lại một vài điểm chính. Khả năng viết các dòng chú thích mới. Khả năng khai báo linh hoạt hơn. Khả năng định nghĩa lại các hàm: các hàm cùng tên có thể thực hiện theo những thao tác khác nhau. Các lời gọi hàm sẽ dùng kiểu và số tham số để xác định đúng hàm nào cần thực hiện. Có thêm các toán tử định nghĩa bộ nhớ động mới: new và delete. Khả năng định nghĩa các hàm inline để tăng tốc độ thực hiện chương trình. Tạo các biến tham chiếu đến các biến khác. LTHĐT trong C++ C++ chứa đựng khái niệm lớp. Một lớp bao gồm các thành phần dữ liệu hay là thuộc tính và các phương thức hay là hàm thành phần. Từ một lớp ta có thể tạo ra các đối tượng hoặc bằng cách khai báo thông thường một biến có kiểu là lớp đó hoặc bằng cách cấp phát bộ nhớ động nhờ sử dụng toán tử new. C++ cho phép chúng ta đóng gói dữ liệu nhưng nó không bắt buộc chúng ta thực hiện điều đó. Đây là một nhược điểm của C++. Tuy nhiên cũng cần thấy rằng bản thân C++ chỉ là sự mở rộng của C nên nó không thể là một ngôn ngữ LTHĐT thuần khiết được. C++ cho phép ta định nghĩa các hàm thiết lập (constructor) cho một lớp. Hàm thiết lập là một phương thức đặc biệt được gọi đến tại thời điểm một đối tượng của lớp được tạo ra. hàm thiết lập có nhiệm vụ khởi tạo một đối tượng: cấp phát bộ nhớ, gán các giá trị cho các thành phần dữ liệu cũng như việc chuẩn bị chỗ cho các đối tượng mới. Một lớp có thể có một hay nhiều hàm thiết lập. Để xác định hàm thiết lập nào cần gọi đến, chương trình biên dịch sẽ so sánh các đối số với các tham số truyền vào. Tương tự như hàm thiết lập, một lớp có thể có một hàm huỷ bỏ (destructor), một phương thức đặc biệt được gọi đến khi đối tượng được giải phóng khỏi bộ nhớ. Lớp trong C++ thực chất là một kiểu dữ liệu do người sử dụng định nghĩa. Khái niệm định nghĩa chồng toán tử cho phép định nghĩa các phép toán trên một lớp giống như các kiểu dữ liệu chuẩn của C. Ví dụ ta có thể định nghĩa một lớp số phức với các phép toán cộng, trừ, nhân, chia. Cũng giống như C, C++ có khả năng chuyển đổi kiểu. Không những thế, C++ còn cho phép mở rộng sự chuyển đổi này sang các kiểu do người sử dụng tự định nghĩa (các lớp). Ví dụ, ta có thể chuyển đổi từ kiểu chuẩn int của C sang kiểu số phức mà ta định nghĩa chẳng hạn. C++ cho phép thực hiện kế thừa các lớp đã xây dựng. Từ phiên bản 2.0 trở đi, C++ còn cho phép một lớp kế thừa cùng một lúc từ nhiều nhiều lớp khác nhau (gọi là sự đa kế thừa). Cuối cùng C++ cung cấp những thao tác vào ra mới dựa trên cơ sở khái niệm luồng dữ liệu (flow). Sự ưu việt của các thao tác này ở chỗ: Sử dụng đơn giản. Kích thước bộ nhớ được rút gọn. Khả năng áp dụng trên các kiểu do người sử dụng định nghĩa bằng cách sử dụng cơ chế định nghĩa chồng toán tử.
File đính kèm:
- Lập trình hướng đối tượng với C++ - Chương 1 Lập trình hướng đối tượng, phương pháp giải quyết bài toán mới.DOC