Chương 1 - C++ Và Hướng Đối Tượng

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 34

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

VỚI C++
Giáo viên: Đậu Anh Tú

Đậu Anh Tú _ Cpp


NỘI DUNG GIẢNG DẠY

 Các định dạng trong bài giảng:


 Từ khoá trong C++
 Các đối tượng, lớp
 Các hàm, phương thức, thuộc tính
 Các từ khoá tiếng Anh
 Lỗi trong quá trình chạy
 Các dòng thông báo
 Các từ cần chú ý

Đậu Anh Tú _ Cpp


NỘI DUNG GIẢNG DẠY

 Chương 1: Lập trình hướng đối tượng và những mở rộng giữa của C++ so với C
 Chương 2: Lớp và Đối tượng
 Chương 3: Hàm bạn, Lớp bạn
 Chương 4: Nạp chồng toán tử và hàm
 Chương 5: Đóng gói và trừu tượng
 Chương 6: Kế thừa
 Chương 7: Đa hình
 Chương 8: Một số vấn đề khác

Đậu Anh Tú _ Cpp


CHƯƠNG 1: Lập trình hướng đối tượng
và những mở rộng giữa của C++ so với C

Đậu Anh Tú _ Cpp


1.1 Lập trình hướng đối tượng

Đậu Anh Tú _ Cpp


1.1.1 Các phương pháp lập trình

 Vào những ngày đầu phát triển của máy tính, khi các phần mềm còn rất đơn giản chỉ cỡ vài chục
dòng lệnh, chương trình được viết tuần tự với các câu lệnh thực hiện từ đầu đến cuối. Cách viết
chương trình như thế này gọi là phương pháp lập trình tuyến tính.
 Khoa học máy tính ngày càng phát triển, các phần mềm đòi hỏi ngày càng phức tạp và lớn hơn rất
nhiều. Đến lúc này phương pháp lập trình tuyến tính tỏ ra kém hiệu quả và có những trường hợp
người lập trình không thể kiểm soát được chương trình
 Phương pháp lập trình cấu trúc (LTCT) ra đời theo cách tiếp cận mới, các chương trình được tổ chức
thành chương trình con, mỗi chương trình con lại có thể chia nhỏ thành các chương trình nhỏ hơn
Các chương trình con tương đối độc lập với nhau, do đó có thể phân công cho từng nhóm đảm nhận
viết các chương trình con khác nhau

Đậu Anh Tú _ Cpp


1.1.1 Các phương pháp lập trình

 Tuy nhiên, khi sử dụng phương pháp lập trình này vẫn còn gặp một khó khăn lớn là tổ chức dữ liệu
của hệ thống như thế nào trong máy tính. Bởi vì theo quan điểm của LTCT thì: Chương trình = Cấu
trúc dữ liệu + Giải thuật. Để làm được việc này đòi hỏi người lập trình phải có kiến rất vững vềcấu
trúc dữ liệu. Một khó khăn nữa gặp phải là giải thuật của chương trình phụ thuộc rất chặt chẽ vào cấu
trúc dữ liệu, do vậy chỉ cần một sự thay đổi nhỏ ở cấu trúc dữ liệu cũng có thể làm thay đổi giải thuật
và như vậy phải viết lại chương trình.
 Một phương pháp lập trình mới ra đời để khắc phục nhược điểm này và đó chính là phương pháp lập
trình hướng đối tượng (LTHĐT). Điểm căn bản của phương pháp này là thiết kế chương trình xoay
quanh dữ liệu của hệ thống. Nghĩa là lúc này các thao tác xử lý của hệ thống được gắn liền với dữ
liệu và như vậy một sự thay đổi nhỏ của dữ liệu chỉ ảnh hưởng đến các một số nhỏ các hàm xử lý liên
quan.
 Một ưu điểm nữa có ở phương pháp LTHĐT là cách tiếp cận bài toán trở nên gần gũi với thực tế hơn.

Đậu Anh Tú _ Cpp


1.1.1 Các phương pháp lập trình

 Trong xã hội, mỗi người đều có một gia đình,


trong đó tồn tại nhiều mối quan hệ gia đình khá
phức tạp như ông, bà, cha, mẹ, cô, chú, bác, v.v.
Thông thường, để thể hiện các mối quan hệ này
người ta biểu diễn bằng một sơ đồ cây quan hệ
 Ví dụ như hình bên:

Đậu Anh Tú _ Cpp


1.1.1 Các phương pháp lập trình

 Để giải quyết bài toán này theo phương pháp


LTCT, công việc đầu tiên là phải xây dựng một
cấu trúc dữ liệu thể hiện được cây quan hệ trên.
Trông qua có vẻ là đơn giản nhưng nếu thử làm
xem sẽ thấy không đơn giản chút nào, thậm chí
còn khó. Bởi vì nó đòi hỏi người lập trình phải rất
thành thạo sử dụng con trỏ, phải xây dựng được
giải thuật cập nhật thông tin trên cây quan hệ.
Các giải thuật này tương đối phức tạp đối với một
cấu trúc dữ liệu như trong bài toán.
 Ví dụ để trả lời được Hưng và Mai có quan hệ
như thế nào, chúng ta phải xây dựng được giải
thuật tìm được mối quan hệ giữa hai nút trên cây
quan hệ để có thể có câu trả lời Hưng là anh họ
Mai Đậu Anh Tú _ Cpp
1.1.2 Lập trình hướng đối tượng

 Lập trình hướng đối tượng (Object Oriented Programming – OOP) là một trong những kỹ thuật lập trình rất
quan trọng và sử dụng nhiều hiện nay. Hầu hết các ngôn ngữ lập trình hiện nay như Java, PHP, .NET, Ruby,
Python, C++… đều hỗ trợ OOP.
 Lập trình hướng đối tượng đặt trọng tâm vào đối tượng, yếu tố quan trọng trong quá trình phát triển chương trình
và không cho phép dữ liệu biến động tự do trong hệ thống. Dữ liệu được gắn chặt với các hàm thành các vùng
riêng mà chỉ có các hàm đó tác động lên và cấm các hàm bên ngoài truy nhập tới một cách tuỳ tiện.
 Trở thành một trong những phương pháp lập trình có tầm quan trọng lớn và được sử dụng phổ biến bởi vì OOP
sở hữu nhiều đặc điểm nổi bật như sau:
o Code OOP có thể sử dụng lại nên giúp cho các lập trình viên tiết kiệm được tài nguyên.
o OOP mô hình hóa được những thứ phức tạo dưới dạng các cấu trúc đơn giản.
o OOP giúp quá trình sửa lỗi trở nên dễ dàng hơn, so với việc tìm lỗi ở nhiều vị trí khác trong code thì tìm lỗi ở trong các
lớp sẽ đơn giản và ít mất thời gian hơn.
o OOP có tính bảo mật cao, có khả năng bảo vệ mọi thông tin thông qua việc đóng gói.
Đậu Anh Tú _ Cpp
o Sử dụng OOP rất dễ dàng mở rộng được dự án.
1.1.2 Lập trình hướng đối tượng

 LTHĐT cho phép chúng ta phân tích bài toán thành các thực thể được gọi là các đối tượng và sau đó
xây dựng các dữ liệu cùng các hàm xung quanh các đối tượng đó. Các đối tượng có thể tác động, trao
đổi thông tin với nhau thông qua cơ chế thông báo (message).

Đậu Anh Tú _ Cpp


1.1.2 Lập trình hướng đối tượng

 LTHĐT có các đặc tính chủ yếu sau:


o 1. Tập trung vào dữ liệu thay cho các hàm
o 2. Chương trình được chia thành các đối tượng.
o 3. Các cấu trúc dữ liệu được thiết kế sao cho đặc tả được đối tượng.
o 4. Các hàm thao tác trên các vùng dữ liệu của đối tượng được gắn với cấu trúc dữ liệu đó.
o 5. Dữ liệu được đóng gói lại, được che giấu và không cho phép các hàm ngoại lai truy nhập tự do.
o 6. Các đối tượng tác động và trao đổi thông tin với nhau qua các hàm
o 7. Có thể dễ dàng bổ sung dữ liệu và các hàm mới vào đối tượng nào đó khi cần thiết
o 8. Chương trình được thiết kế theo cách tiếp cận từ dưới lên (bottom-up).

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Lớp (class)
o Có thể hiểu là định nghĩa chung cho 1 tập dữ liệu có những đặc điểm chung
 Đối tượng (object)
o Có thể hiểu là 1 ví dụ cụ thể cho định nghĩa chung ở trên

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Tính đóng gói dữ liệu (Encapsulation)


o Trong LTCT ta đã thấy là các hàm hay thủ tục được sử dụng mà không cần biết đến nội dung cụ thể
của nó. Người sử dụng chỉ cần biết chức năng của hàm cũng như các tham số cần truyền vào để gọi
hàm chạy mà không cần quan tâm đến những lệnh cụ thể bên trong nó. Người ta gọi đó là sự đóng
gói về chức năng.
o Trong LTHĐT, không những các chức năng được đóng gói mà cả dữ liệu cũng như vậy. Với mỗi đối
tượng người ta không thể truy nhập trực tiếp vào các thành phần dữ liệu của nó mà phải thông qua
các thành phần chức năng (các phương thức) để làm việc đó.

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Tính trừu tượng (Abstraction)


o Tính trừu tượng là một trong 4 tính chất đặc trưng quan trọng của các ngôn ngữ lập trình hướng
đối tượng. Mục tiêu chính của nó là làm giảm sự phức tạp bằng cách ẩn các chi tiết không liên
quan trực tiếp tới người dùng (người dùng ở đây không phải người dùng cuối mà là lập trình
viên). Điều đó cho phép người dùng vẫn thực hiện được các công việc cần thiết dựa trên một
thực thể trừu tượng được cung cấp mà không cần hiểu hoặc thậm chí không nghĩ về tất cả sự
phức tạp ẩn giấu bên trong.

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Tính kế thừa (Inheritance)


o 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.

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Tính đa hình (Polymorphime)


o 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.

Đậu Anh Tú _ Cpp


1.1.3 Một số khái niệm trong LTHĐT

 Các ưu điểm của LTHĐT


o 1. 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.
o 2. 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.
o 3. 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.
o 4. 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.
o 5. 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.
o 6. 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.
o 7. 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.
o 8. Có thể quản lý được độ phức tạp của những sản phẩm phần mềm.
Đậu Anh Tú _ Cpp
1.2 C++ và LTHĐT

Đậu Anh Tú _ Cpp


1.2.1 LTHĐT trong C++

 C++ :là một loại ngôn ngữ lập trình bậc trung (middle-level). Đây là ngôn ngữ lập
trình đa năng được tạo ra bởi Bjarne Stroustrup như một phần mở rộng (đáng kể)
của ngôn ngữ lập trình C, hoặc "C với các lớp Class“
 Ngôn ngữ đã được mở rộng đáng kể theo thời gian và C ++ hiện đại có các tính
năng: lập trình tổng quát, lập trình hướng đối tượng, lập trình thủ tục, ngôn ngữ đa
mẫu hình tự do có kiểu tĩnh, dữ liệu trừu tượng, và lập trình đa hình, ngoài ra còn
có thêm các tính năng, công cụ để thao tác với bộ nhớ cấp thấp.
 C++ được thiết kế hướng tới lập trình hệ thống máy tính và phần mềm nhúng trên
các mạch vi xử lý, bao gồm cả hệ thống có tài nguyên hạn chế và tài nguyên khổng
lồ, với ưu điểm vượt trội về hiệu suất, hiệu quả và tính linh hoạt cao

Đậu Anh Tú _ Cpp


1.2.1 LTHĐT trong C++

 C++ cho phép ta định nghĩa các phương thức khởi tạo (constructor) cho một lớp. Phương thức
khởi tạo 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. phương thức khởi tạo 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 phương thức khởi tạo. Để xác định phương thức khởi tạo 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ư phương thức khởi tạo,
một lớp có thể có một phương thức huỷ (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ớ.

Đậu Anh Tú _ Cpp


1.2.1 LTHĐT trong C++

 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)
 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ỗ:
o Sử dụng đơn giản.
o Kích thước bộ nhớ được rút gọn.
o 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ử.

Đậu Anh Tú _ Cpp


1.3 Một số mở rộng của C++ so với C

Đậu Anh Tú _ Cpp


1.3.1 Chú thích và kiểu dữ liệu trong C++

 Ngôn ngữ lập trình C chỉ hỗ trợ 1 kiểu chú thích duy nhất là chú thích theo dòng
 Khác với C, C++ hỗ trợ 2 kiểu chú thích:
o Chú thích theo dòng ( // )
o Chú thích theo đoạn (/* */)
 C++ hỗ trợ thêm các kiểu dữ liệu so với C như bool, wchar_t ...
 Cùng với đó, C++ hỗ trợ các phép chuyển kiểu mới :static_catch, const_catch,
dynamic_catch, reinterpret_catch. Linh hoạt hơn trong từng trường hợp

Đậu Anh Tú _ Cpp


1.3.2 Tham chiếu (reference)

 C không hỗ trợ tham chiếu cho nên để quản lý 1 biến ta cần truyền địa chỉ của
biến đấy hoặc sử dụng 1 biến khác có cấp con trỏ lớn hơn biến cần quản lý 1 cấp
Ví dụ:
 C++ hỗ trợ tham chiếu trực tiếp, thuận tiện cho lập trình viên
Ví dụ:

Đậu Anh Tú _ Cpp


1.3.3 Cấp phát bộ nhớ động

 C++ hỗ trợ 2 toán tử: new, delete giúp lập trình viên dễ dàng trong việc sử dụng
vùng nhớ Heap, thay vì phải sử dụng hàm để cấp phát trong C.
 Cấp phát động trong C++ cũng linh hoạt hơn khi không cần phải tính toán kích
thước của vùng nhớ.

Đậu Anh Tú _ Cpp


1.3.4 Nạp chồng hàm (Functions overloading)

 C++ cho phép sử dụng những hàm có cùng tên (có thể khác kiểu trả về) nhưng
khác tham số truyền vào
 Quy tắc nạp chồng:
o Các hàm trùng tên phải khác nhau về tham số: Số lượng, thứ tự, kiểu
 Quy tắc gọi hàm:
o Tìm hàm có kiểu tham số phù hợp
o Dùng phép ép kiểu tự động
o Tìm hàm gần đúng (phù hợp) nhất

Đậu Anh Tú _ Cpp


1.3.4 Nạp chồng hàm (Funtions overloading)

 Ví dụ:

Đậu Anh Tú _ Cpp


1.3.5 Phạm vi khai báo
 Không giống như C, chúng ta có thể khai báo một biến tại một vị trí bất kỳ trong
chương trình.
 Một biến chỉ có tầm tác dụng trong khối lệnh nó được khai báo.
 Do đó, C++ cung cấp toán tử định phạm vi (::) để xác định rõ biến nào được sử
dụng khi xảy ra tình trạng định nghĩa chồng một tên biến trong một khối lệnh con.
 Toán tử phạm vi (::) : Thường được dùng để truy cập các đối tượng toàn cục trong
trường hợp có đối tượng cục bộ trùng tên
Ví dụ:

Đậu Anh Tú _ Cpp


1.3.6 Không gian tên (namespace)

 Đặt vấn đề: Khi đang lập trình, chúng ta include 2 thư viện khác nhau nhưng có 1
hàm trùng tên và tham số truyền vào với nhau nhưng xử lý của mỗi hàm là khác
nhau, vấn đề đặt ra là làm sao trình biên dịch hiểu được chúng ta đang gọi hàm nào?
 Namespace sẽ giải quyết trọn vẹn vấn đề này!
 Định nghĩa: Namespace là từ khóa trong C++ được sử dụng để định nghĩa một
phạm vi nhằm mục đích phân biệt các hàm, lớp, biến, ... cùng tên trong các thư viện
khác nhau.
 Tại sao cần sử dụng namespace?
o Trong các project lớn, sẽ có các hàm, lớp, ... cùng tên được định nghĩa, nhưng nội
dụng khác nhau (giống như vd trên ). Trong những trường hợp này cần đặt các hàm,
lớp, ... này vào các namespace khác nhau để trình biên dịch có thể phân biệt được,
cũng như việc tường minh code cho những người cần đọc và sử dụng sau đó.
Đậu Anh Tú _ Cpp
1.3.6 Không gian tên (namespace)
 Cú pháp khai báo:

 Sử dụng namespace:
Ví dụ:

Đậu Anh Tú _ Cpp


1.3.6 Không gian tên (namespace)

 Trường hợp nếu cảm thấy việc gọi hàm thông qua namespace quá dài dòng và
không cần thiết, chúng ta có thể sử dụng từ khóa using để khai báo namespace
cần sử dụng cho các hàm được định nghĩa trong namespace.
 Cú pháp:
 Ví dụ:

Đậu Anh Tú _ Cpp


1.3.6 Không gian tên (namespace)
 Chúng ta có thể xây dựng các namespace lồng nhau, lúc đấy gọi hàm trong
namespace sẽ cần các cấp namespace tương ứng liên tiếp nhau, được phân cách
bằng toán tử phạm vi
 Ví dụ:

Đậu Anh Tú _ Cpp


1.3.6 Không gian tên (namespace)

 Việc sử dụng namespace mục đích để nhóm các hàm liên quan với nhau và tránh
việc sử dụng hàm trùng tên.
 Chúng ta có thể xây dựng nhiều namespace khác nhau phù hợp với mục đích
của lập trình viên
 Các hàm không nằm trong bất kỳ namespace nào thì không cần phải khai báo
namespace khi sử dụng

Đậu Anh Tú _ Cpp

You might also like