







Preview text:
lOMoAR cPSD| 45740153
1.Cấu trúc một chương trình hướng đối tượng trong C++
- Khai báo các thư viện dùng trong chương trình
- Khai báo các hằng, các biến toàn cục (nếu có)
- Khai báo, định nghĩa các kiểu dữ liệu (nếu có)
- Khai báo, định nghĩa các lớp
- Định nghĩa các hàm tự do, các phương thức (nếu có)
- Chương trình chính
- Định nghĩa các hàm tự do(nhưng phải khai báo hàm đó trước hàm main) (nếu có)
- Định nghĩa các phương thức của lớp (nếu có)
2.Tái định nghĩa toán tử cho phép toán Khai báo và định nghĩa các toán tử:
operator ([ds_tham_số]) Số tham số:
- Nếu hàm toán tử là hàm tự do hoặc hàm bạn của lớp: số tham số phải đúng bằng
số toán hạng của phép toán.
- Hàm toán tử là hàm thành phần: Có một tham số ngầm định là đối tượng gọi hàm
nên chỉ có một tham số tường minh.
1. Khái niệm kế thừa
Kế thừa cho phép các lớp được xây dựng từ các lớp khác đã có. Một lớp được xây
dựng kế thừa một lớp khác gọi là lớp dẫn xuất (derived class). Lớp dùng để xây dựng
lớp dẫn xuất gọi là lớp cơ sở (base class). Lớp dẫn xuất sẽ kế thừa các thành phần (dữ
liệu, hàm) của lớp cơ sở, đồng thời bổ sung các thành phần mới.
Một số trường hợp sau đây không cho phép sử dụng tính kế thừa. - Hàm tạo. - Hàm hủy.
- Các toán tử mới do người dùng định nghĩa.- Các toán tử gán do người dùng định nghĩa - Quan hệ friend. 2. Đơn kế thừa
Trong mối quan hệ kế thừa, lớp chỉ có một lớp cơ sở gọi là đơn kế thừa
c. Hàm tạo và hàm hủy trong kế thừa.
- Nếu lớp cơ sở và lớp dẫn xuất không định nghĩa hàm tạo thì hàm tạo ngầm định của
hai lớp sẽ đươc gọi theo đúng thứ tự.
- Nếu lớp cơ sở và lớp dẫn xuất có định nghĩa hàm tạo thì khi định nghĩa hàm tạo lớp
dẫn xuất luôn mô tả một lời gọi tới một trong các hàm tạo tương ứng ở lớp cơ sở.
Trong đó, hàm tạo không tham số của lớp dẫn xuất có thể có hoặc không cần mô tả
lại một lời gọi đến hàm tạo không tham số lớp cơ sở.
Hàm hủy thứ tự gọi ngược lại với hàm tạo. Khi hủy đối tượng hàm hủy lớp dẫn
xuất được gọi trước, rồi đến hàm hủy lớp cơ sở. d. Phạm vi truy xuất
- Lớp dẫn xuất chỉ được truy nhập đến thành phần protected và public của lớp cơ sở
không được phép truy nhập đến thành phần private. - Các kiểu kế thừa: lOMoAR cPSD| 45740153
+ Nếu một lớp dẫn xuất kế thừa lớp cơ sở là public thì mọi thành phần public của lớp
cơ sở sẽ trở thành thành phần public của lớp dẫn xuất, thành phần protected lớp cơ
sở sẽ trở thành thành phần protected của lớp dẫn xuất.
+ Nếu một lớp dẫn xuất kế thừa lớp cơ sở là private thì mọi thành phần public,
protected của lớp cơ sở sẽ trở thành thành phần private của lớp dẫn xuất.
+ Nếu một lớp dẫn xuất kế thừa lớp cơ sở là protected thì mọi thành phần public,
protected của lớp cơ sở sẽ trở thành thành phần protected của lớp dẫn xuất.
+ Nếu không có từ khoá chỉ định kế thừa từ lớp cơ sở thì lớp dẫn xuất ngầm định là kế thừa private. 1. Đa kế thừa -
Trong đa kế thừa, khi liệt kê các lớp cơ sở cần kế thừa, mỗi lớp được phân cách
nhau bởi dấu phẩy “,”. -
Mỗi lớp cơ sở có thể có một kiểu dẫn xuất bởi một từ khoá dẫn xuất khác nhau. -
Nguyên tắc truy nhập vào các thành phần lớp cơ sở cũng hoàn toàn tương tự như trong kế thừa đơn
• Thứ tự gọi các hàm tạo: Các hàm tạo của các lớp cơ sở theo thứ tự khai báo của
các lớp cơ sở trong lớp kế thừa lần lượt được gọi, sau cùng là hàm tạo của lớp kế thừa mới được gọi.
• Thứ tự gọi các hàm hủy: Các hàm hủy được gọi theo thứ tự ngược lại với cách gọi hàm tạo.
• Truy nhập thành phần lớp cơ sở: Giống như trong đơn kế thừa, trong hàm thành
phần của lớp dẫn xuất có thể sử dụng tất cả các hàm thành phần public (hoặc
protected) của lớp cơ sở.
• Cách gọi hàm thành phần của lớp cơ sở:
- Việc truy nhập từ đối tượng lớp dẫn xuất đến các thành phần của mỗi lớp cơ sở
được tuân theo quy tắc phạm vi tương tự như trong đơn kế thừa. - Trong trường
hợp các lớp cơ sở đều có các thành phần cùng tên, việc truy xuất đến thành phần
của lớp nào phải được chỉ rõ bằng toán tử phạm vi:
“::” đối với thành phần lớp cơ sở đó. 2. Lớp cơ sở ảo
Trong đa kế thừa, thường gặp tình huống một lớp cơ sở có nhiều lớp kế thừa trực tiếp như hình sau:
Lớp D kế thừa lớp A hai lần, như vậy các thành phần (hàm, dữ liệu) sẽ xuất hiện trong
D hai lần. Các thành phần dữ liệu bị lặp lại trong các đối tượng (thành phần dữ liệu của
mỗi đối tượng là độc lập). Để khắc phục điều này, khai báo lớp cơ sở A là lớp cơ sở ảo của lớp B, C.
Trong khai báo lớp dẫn xuất B,C bổ sung trước tên lớp kế thừa từ khóa virtual. 1. Phương thức ảo
Phương thức ảo là một hàm thành viên khai báo trong lớp cơ sở và được định nghĩa
lại (ghi đè) trong các lớp dẫn xuất.
Khai báo phương thức ảo bằng cách thêm từ khóa virtual ở phía trước. Khi đó các
phương thức có cùng kiểu, cùng tên và cùng danh sách tham số với phương thức này
trong các lớp dẫn xuất cũng là phương thức ảo. lOMoAR cPSD| 45740153
Các lưu ý khi sử dụng phương thức ảo:
Phương thức ảo sẽ cung cấp giải pháp (tại thời điểm thực thi):
- Tham chiếu đến kiểu thực sự của đối tượng.
- Sự kết nối xảy ra tại thời điểm thực thi là kết nối động.- Làm giảm tốc độ thực thi
của chương trình - Chỉ hoạt động thông qua con trỏ.
- Chỉ hoạt động nếu các hàm ở lớp cơ sở và lớp con có nghi thức giaotiếp giống
hệt nhau (cùng tên, cùng kiểu, cùng danh sách tham số) - Nếu ở lớp con
không định nghĩa lại phương thức ảo thì sẽ gọi phương thức ở lớp cơ sở (gần nhất có định nghĩa).
2. Phương thức thuần ảo
Phương thức thuần ảo là một phương thức ảo mà nội dung của nó không có gì.
Một phương thức thuần ảo bắt buộc phải được ghi đè lại trong lớp dẫn xuất kế thừa
từ lớp chứa phương thức thuần ảo này.
3. Lớp cơ sở trừu tượng
Lớp chứa ít nhất một phương thức ảo thuần túy được gọi là lớp cơ sở trừu tượng
(asbtract class). Một lớp cơ sở trừu tượng là một lớp chỉ được dùng làm cơ sở, định
nghĩa một số khái niệm tổng quát, chung cho các lớp khác. Lớp trừu tượng tồn tại vì
mục đích sử dụng để các lớp khác kế thừa từ nó do đó không có đối tượng thực sự
của lớp này được tạo ra trong chương trình. 1. Khuôn hình hàm:
Những hàm được xây dựng với những kiểu tham số trừu tượng do đó có thể sử dụng
được với nhiều kiểu dữ liệu truyền vào khác nhau gọi là khuôn hình hàm. Chương
trình dịch sẽ tự động tạo ra những thể hiện thích hợp nhất của hàm khi có lời gọi đến
chúng trong chương trình.[1] 2. Khuôn hình lớp:
Những lớp được xây dựng trong đó các thành phần dữ liệu hoặc các hàm thành phần
của lớp sử dụng các kiểu dữ liệu trừu tượng gọi làm khuôn hình lớp. Khi chương trình
có nhu cầu sử dụng lớp với những kiểu dữ liệu cụ thể thì chương trình dịch sẽ tự
động biên dịch những thể hiện thích hợp nhất.[1]
Có thể hình dung khuôn hình giống như cái khuôn đúc ra các hàm hoặc các lớp
hoàn toàn giống nhau về mô hình xử lý, chỉ khác về kiểu dữ liệu áp dụng. Trong đó: Tham số khuôn hình: -
Tham số kiểu: Đại diện cho một kiểu dữ liệu trừ tượng. Một khuôn hình hàm
hay khuôn hình lớp có thể sử dụng được nhiều tham số kiểu. Một ví dụ của tham số
biểu thức là kiểu T trong ví dụ khuôn hình hàm và khuôn hình lớp đã đưa ra ở trên. -
Tham số biểu thức: Đối với khuôn hình lớp, tham số biểu thức được sử dụng
để tạo ra những lớp thể hiện linh động hơn. Giá trị truyền cho tham số biểu thức phải
là các hằng số. Một ví dụ cho tham số biểu thức là tham số n trong ví dụ về khuôn
hình lớp đã xét ở trên.
3. Sử dụng khuôn hình hàm
Khuôn hình hàm được sử dụng như một hàm thông thường. Khi thực hiện dựa trên
kiểu dữ liệu của các tham số truyền vào cho hàm, chương trình dịch sẽ tạo ra một
hàm thể hiện tương ứng.
• Định nghĩa chồng khuôn hình hàm lOMoAR cPSD| 45740153
Cũng giống như những định nghĩa chồng hàm, các khuôn hình hàm cũng có thể định nghĩa chồng.
4. Sử dụng khuôn hình lớp
Khi định nghĩa các biên thuộc kiểu thể hiện của một khuôn hình lớp, cần phải chỉ rõ
những kiểu dữ liệu cụ thể nào tương ứng các tham số kiểu hoặc hằng số nào tương
ứng các tham số biểu thức.
• Cụ thể hóa các thành phần hàm trong một khuôn hình lớp Cũng giống như các thể
hiện của khuôn hình hàm, đôi khi mô hình xử lý của một khuôn hình lớp đòi hỏi phải
được xây dựng một cách đặc biệt đối với một số tham số kiểu. Khi đó, C++ hỗ trợ cách
cụ thể hóa những thành phần hàm trong thể hiện tương ứng.
• Khai báo bạn bè với lớp khuôn hình
Khi một hàm hoặc một lớp được khai báo là bạn bè của một khuôn hình lớp thì nó sẽ
là bạn bè của tất cả các lớp thể hiện của khuôn hình lớp đó.
Nếu như ta muốn hàm, lớp bạn bè là những thể hiện của khuôn hình hàm hay khuôn
hình lớp thì trong khai báo bạn bè cần phải chỉ rõ những tham số khuôn hình cần
thiết cho các thể hiện này.
1. Các giai đoạn phát triển hệ thống
Có năm giai đoạn để phát triển hệ thống phần mềm theo hướng đối tượng:
Phân tích yêu cầu (Requirement analysis): Bằng việc tìm hiểu các trường hợp sử dụng
(use case) để nắm bắt các yêu cầu của khách hàng, của vấn đề cần giải quyết. Qua
trường hợp sử dụng này, các nhân tố bên ngoài có tham gia vào hệ thống cũng được
mô hình hóa bằng các tác nhân.
Phân tích (Analysis): Từ các đặc tả yêu cầu trên, hệ thống sẽ bước đầu được mô hình
hóa bởi các khái niệm lớp, đối tượng và các cơ chế để diễn tả hoạt động của hệ
thống. Trong giai đoạn phân tích chỉ mô tả các lớp trong lĩnh vực của vấn đề cần giải
quyết chứ không đi sâu vào các chi tiết kỹ thuật.
Thiết kế (Design: Trong giai đoạn thiết kế, các kết quả của quá trình phân tích được
mở rộng thành một giải pháp kỹ thuật. Một số các lớp được thêm vào để cung cấp cơ
sở hạ tầng kỹ thuật như lớp giao diện, lớp cơ sở dữ liệu, lớp chức năng, …
Lập trình (Programming): Đây còn gọi là bước xây dựng, giai đoạn này sẽ đặc tả chi
tiết kết quả của giai đoạn thiết kế.
Kiểm tra (Testing): Trong giai đoạn kiểm tra, có bốn hình thức kiểm tra hệ thống: Kiểm
tra từng đơn thể (unit testing) được dùng kiểm tra các lớp hoặc các nhóm đơn. Kiểm
tra tính tích hợp (integration testing), được kết hợp với các thành phần và các lớp.
Kiểm tra hệ thống (system testing) chỉ để kiểm tra xem hệ thống có đáp ứng được
chức năng mà người dùng yêu cầu không. Kiểm tra tính chấp nhận được(acceptance
testing) được thực hiện bởi khách hàng, việc kiểm tra cũng thực hiện giống như
kiểm tra hệ thống. 2. Cách tìm lớp
Lớp nên được tìm từ phạm vi bài toán cần giải quyết, vì vậy tên của lớp cũng nên đặt
tên các đối tượng thực mà cần biểu diễn. Để tìm ra lớp cho bài toán, cần trả lời các câu hỏi sau: -
Có thông tin nào cần lưu trữ hay phân tích không? Nếu có bất kỳ thông tin nào
cần phải lưu trữ, biến đổi, phân tích hoặc xử lý thì đó chính là một lớp dự định cần xây dựng. -
Có hệ thống bên ngoài hay không? Hệ thống ngoài có thể được xemnhư các
lớp mà hệ thống đang xây dụng chứa hoặc tương tác với nó. lOMoAR cPSD| 45740153 -
Có các mẫu thiết kế, thư viện lớp, thành phần, … hay không?- Tác nhân đóng
vai trò như thế nào trong hệ thống? Các tác nhân này nên được xem là lớp như người
sử dụng, khách hàng, người điều khiển hệ thống,…
3. Các bước cần thiết để thiết kế chương trình
Để thiết kế một chương trình theo hướng đối tượng, cần trải qua bốn bước sau, từ
đó xây dựng được một cây phả hệ mang tính kế thừa và các mối quan hệ giữa các đối tượng: -
Xác định các dạng đối tượng (lớp) của bài toán (định dang các đối tượng). -
Tìm kiếm các đặc tính chung (dữ liệu chung) trong các dạng đối tượng này,
những gì chúng cùng nhau chia sẻ. -
Xác định được lớp cơ sở dựa trên cơ sở các đặc tính chung của các dạng đối tượng. -
Từ lớp cơ sở, sử dụng quan hệ tổng quát hóa để đặc tả trong việc đưa ra các
lớp dẫn xuất chứa các thành phần, những đặc tính không chung còn lại của dạng đối
tượng. Bên cạnh đó, còn đưa ra các lớp có quan hệ với các lớp cơ sở và lớp dẫn xuất;
các quan hệ này có thể là quan hệ kết hợp, quan hệ tập hợp lại, quan hệ phụ thuộc.
Từ các bước trên, thu được được cây phả hệ và quan hệ giữa các lớp
5. Thực hành lập trình hướng đối tượng có mấy tính chất Đối tượng (Object)
Đối tượng trong OOP bao gồm 2 thành phần chính: •
Thuộc tính (Attribute): là những thông tin, đặc điểm của đối tượng •
Phương thức (Method): là những hành vi mà đối tượng có thể thực hiện
Để dễ hình dung, ta có một ví dụ thực tế về đối tượng là smartphone. Đối tượng này sẽ có: •
Thuộc tính: màu sắc, bộ nhớ, hệ điều hành… Phương thức: gọi điện,
chụp ảnh, nhắn tin, ghi âm… Lớp (Class)
Lớp là sự trừu tượng hóa của đối tượng. Những đối tượng có những đặc tính
tương tự nhau sẽ được tập hợp thành một lớp. Lớp cũng sẽ bao gồm 2 thông tin
là thuộc tính và phương thức.
Một đối tượng sẽ được xem là một thực thể của lớp.
Tiếp nối ví dụ ở phần đối tượng (object) phía trên, ta có lớp (class) smartphone gồm 2 thành phần: •
Thuộc tính: màu sắc, bộ nhớ, hệ điều hành… •
Phương thức: gọi điện, chụp ảnh, nhắn tin, ghi âm…
Các đối tượng của lớp này có thể là: iPhone, Samsung, Oppo, Huawei… lOMoAR cPSD| 45740153
*đặc tính cơ bản của OOP
Tính đóng gói (Encapsulation)
Tính đóng gói cho phép che giấu thông tin và những tính chất xử lý bên trong của
đối tượng. Các đối tượng khác không thể tác động trực tiếp đến dữ liệu bên trong
và làm thay đổi trạng thái của đối tượng mà bắt buộc phải thông qua các phương
thức công khai do đối tượng đó cung cấp.
Tính chất này giúp tăng tính bảo mật cho đối tượng và tránh tình trạng dữ liệu bị hư hỏng ngoài ý muốn.
Tính kế thừa (Inheritance)
Đây là tính chất được sử dụng khá nhiều. Tính kế thừa cho phép xây dựng một lớp
mới (lớp Con), kế thừa và tái sử dụng các thuộc tính, phương thức dựa trên lớp cũ
(lớp Cha) đã có trước đó.
Các lớp Con kế thừa toàn bộ thành phần của lớp Cha và không cần phải định nghĩa
lại. Lớp Con có thể mở rộng các thành phần kế thừa hoặc bổ sung những thành phần mới.
Tính đa hình (Polymorphism)
Tính đa hình trong lập trình OOP cho phép các đối tượng khác nhau thực thi chức
năng giống nhau theo những cách khác nhau.
Tính trừu tượng (Abstraction)
Tính trừu tượng giúp loại bỏ những thứ phức tạp, không cần thiết của đối tượng
và chỉ tập trung vào những gì cốt lõi, quan trọng.
Mảng là một loại cấu trúc dữ liệu trong ngôn ngữ lập trình C/C++, nó lưu
trữ một tập hợp tuần tự các phần tử cùng kiểu với độ dài cố định. Mảng
thường được sử dụng để lưu trữ tập hợp dữ liệu, nhưng nó cũng hữu
dụng khi dùng để lưu trữ một tập hợp biến có cùng kiểu.
Hàm bạn của một lớp không phải là hàm thành viên nên nó không phụ thuộc vào lớp và có
thể định nghĩa ở trong hoặc ngoài lớp
Hàm bạn có thể truy cập trực tiếp các thành viên private và một lớp có thể có nhiều hàm bạn
Lớp bạn cũng giống như hàm bạn là nó có thể truy cập các biến thành viên private của lớp kia.
Ta có class A là bạn của class B nên tất cả hàm thành viên của lớp B là bạn của lớp A và chiều
ngược lại thì không đúng.
Public (Công khai): đây là thuộc tính công khai, khi được khai báo vào trong biến
hoặc hàm. Các thuộc tính và phương thức này có thể truy xuất ra bên ngoài class.
(Các class khác có thể sử dụng chức năng được công khai này). lOMoAR cPSD| 45740153
Protected (Được bảo vệ): các thuộc tính các phương thức không thể truy xuất ra bên
ngoài class. Nó chỉ được gọi trong class và class kế thừa. (Ví dụ class dogs sẽ kế thừa
class animal và truy xuất được các thuộc tính được kế thừa từ class animal trước đó).
Private (Riêng tư): các thuộc tính các phương thức không thể truy xuất ra bên ngoài
class. Nó chỉ được gọi trong phạm vi class. (Đây là class riêng tư, chỉ dùng trong nội bộ của class đó). —————– •
Chế độ truy xuất công cộng (public): Các thành viên nếu được thiết lập ở chế
độ này sẽ được nhìn thấy và truy xuất ở mọi nơi trong chương trình. •
Chế độ truy xuất riêng tư (private): Các thành viên nếu được thiết lập ở chế
độ này sẽ chỉ được nhìn thấy và truy xuất được ở bản thân lớp định nghĩa thành viên đó. •
Chế độ bảo vệ (protected): Chế độ này sẽ được dùng để giới hạn truy cập tới
các lớp được thừa kế và bản thân lớp định nghĩa thành viên đó. •
Hàm khởi tạo là một hàm đặc biệt trong lớp. Hàm này được gọi tự động khi
một đối tượng được tạo ra. Hàm khởi tạo sẽ khởi tạo giá trị cho các thuộc
tính của đối tượng. Trong C++, một hàm khởi tạo có đặc điểm sau: •
− Tên hàm khởi tạo trùng với tên của lớp. •
− Hàm khởi tạo không có kiểu dữ liệu trả về (kể cả void). •
− Hàm khởi tạo phải được khai báo với phạm vi truy cập là public. •
− Hàm khởi tạo có thể có đối số hoặc không có đối số. •
− Trong một lớp có thể có nhiều hàm khởi tạo (cùng tên nhưng khác đối số).
Hàm khởi tạo mà không có đối số nào thì được gọi là hàm khởi tạo mặc định.
Hàm này thường dùng gán giá trị mặc định cho các thuộc tính trong lớp. lOMoAR cPSD| 45740153
2. Hàm hủy (destructor)
Hàm huỷ sẽ tự động được gọi trước khi giải phóng một đối tượng để giải phóng
vùng nhớ trước khi đối tượng được hủy bỏ. Hàm hủy có các đặc điểm sau:
− Mỗi lớp chỉ có một hàm hủy.
− Hàm hủy không có kiểu, không có giá trị trả về và không có đối số.
− Tên hàm huỷ cùng tên với tên lớp và có một dấu ngã (~) ngay trước tên.