Chào mọi người, đây là bài đầu tiên trong series Lập Trình Hướng Đối Tượng C++. Trong bài này chúng ta sẽ cùng đi tìm hiểu Lập Trình Hướng Đối Tượng là gì ? Những khái niệm và đặc điểm cơ bản của Lập Trình Hướng Đối Tượng.
Nội dung các bài trong Series
Phần 1: Lý Thuyết
- Bài 1: Giới thiệu về lập trình hướng đối tượng ( bài hiện tại )
- Bài 2: Lớp và đối tượng trong C++
- Bài 3: Hàm khởi tạo và Hàm huỷ
- Bài 4: Hàm bạn và Lớp bạn
- Bài 5: Nạp chồng hàm và nạp chồng toán tử
- Bài 6: Tính Kế Thừa trong lập trình hướng đối tượng
- Bài 7: Tính Đa Hình trong lập trình hướng đối tượng
Phần 2: Bài Tập
- Bài 8: Tạo lớp (class) trong C++
- Bài 9: Bài Tập về Tính Kế Thừa
- Bài 10: Bài Tập Tổng Hợp
Giới thiệu khóa học “Học C bá đạo” hoàn toàn miễn phí sẽ giúp ích bạn rất nhiều trong việc tiến tới học lập trình hướng đối tượng: Xem tại đây
Lập trình Hướng đối tượng là gì?
Lập trình hướng đối tượng (Tiếng Anh: Object Oriented Programming, viết tắt: OOP) là một mẫu hình lập trình dựa trên khái niệm “công nghệ đối tượng”.
Một đối tượng gồm:
- Các dữ liệu gọi là: thuộc tính (Attribute).
- Mã nguồn được tổ chức thành các phương thức (Method).
Các phương thức giúp cho đối tượng có thể truy xuất và hiệu chỉnh các trường dữ liệu của đối tượng khác, mà đối tượng hiện tại có tương tác (đối tượng được hỗ trợ các phương thức “this” hoặc “self”).
Trong lập trình hướng đối tượng, chương trình máy tính được thiết kế bằng cách tách nó ra khỏi phạm vi các đối tượng tương tác với nhau. Ngôn ngữ lập trình hướng đối tượng khá đa dạng, phần lớn là các ngôn ngữ lập trình theo lớp (class), nghĩa là các đối tượng trong các ngôn ngữ này được xem như thực thể của một lớp, được dùng để định nghĩa một kiểu dữ liệu.
Các khái niệm cơ bản của OOP
Đối tượng (Object)
Trong lập trình hướng đối tượng, một đối tượng được hiểu giống như 1 thực thể: người, vật, … Một đối tượng bao gồm 2 thành phần: Thuộc Tính và Phương Thức
- Thuộc Tính (Attribute): Là những đặc điểm, thông tin của đối tượng (Vd: Xét với đối tượng là một người thì sẽ có các thuộc tính là: Tên, Tuổi, Màu Da, Màu Tóc, Chiều Cao, Cân Nặng, …)
- Phương Thức (Method): Là những hành động mà đối tượng đó có thể thưc hiện (VD: Vẫn xét với đối tượng là một người thì sẽ có hành động: đi, nói, ăn, uống, …)
Lớp (Class)
Các đối tượng có đặc tính tương như nhau sẽ được gom lại thành một lớp đối tượng. Một lớp cũng sẽ có 2 thành phần là Thuộc Tính và Phương Thức. Ngoài ra, lớp cũng có thể được dùng để định nghĩa một kiểu dữ kiệu mới.
Các đặc điểm của lập trình hướng đối tượng
Lập trình hướng đối tượng là một phương pháp lập trình có 4 tính chất chính sau:
Tính trừu tượng (Abstraction)
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.
Lấy một ví dụ đơn giản nhé: Khi bạn ra quán cafe, gọi nhân viên “Em ơi, cho anh một cốc cafe đen đá “. Khoảng 5 phút sau là bạn có ngay một cốc cafe trên tay mà không cần biết nhân viên đã pha chế cốc cafe đó như thế nào. Việc của bạn đơn giản chỉ là thông báo cho nhân viên biết bạn cần mua cafe, sau đó trả tiền và thưởng thức.
Tính đóng gói (Encapsulation) và che giấu dữ liệu (Data Hiding)
Tính đóng gói (Encapsulation) chỉ đơn giản là việc kết hợp một bộ các dữ liệu (data) liên quan đến nhau cùng với một bộ các hàm/phương thức (functions/methods) hoạt động trên các dữ liệu đó.Sau đó “gói” tất cả vào trong một cái gọi là lớp (class). Các thực thể của các class thì được gọi là các đối tượng (objects) trong khi class giống như một công thức được sử dụng để tạo ra các đối tượng đó.
Một ví dụ về tính đóng gói:
Tính đóng gói thể hiện ở đoạn code trên là kết hợp các thuộc tính ten, tuoi và phương thức input(), output() vào trong class connguoi.
Che giấu dữ liệu (Data Hiding) là việc một số dữ liệu (data) và hàm/phương thức (functions/methods) được lớp (class) che giấu đi (ở dạng private) để đảm bảo rằng các dữ liệu đó sẽ được truy cập và sử dụng đúng mục đích, đúng cách thông qua các hàm/phương thức (functions/methods) ở dạng public mà class cung cấp. Bạn không thể truy cập đến các private data hoặc gọi đến private methods của class từ bên ngoài class đó.
Che giấu dữ liệu chỉ là một phương pháp kỹ thuật mà bạn áp dụng để xây dựng nên class mà thôi, nó không phải là tính chất đặc trưng của lập trình hướng đối tượng, việc bạn có áp dụng phương pháp này hay không là hoàn toàn không bắt buộc. Tuy nhiên trong các hệ thống thật, để nâng cao tính bảo mật, giảm phụ thuộc giữa các class, tránh lỗi đọc ghi dữ liệu sai cách, … thì việc áp dụng phương pháp che giấu dữ liệu gần như là đương nhiên.
Nhìn lại đoạn code bên trên có thể thấy là các dữ liệu như ten, tuoi được để ở dạng private. Bạn chỉ có thể truy cập chúng thông qua các phương thức public như: input(), output(). Đó chính là Data Hiding.
Tính đa hình (Polymorphism)
Trong lập trình hướng đối tượng và cụ thể là trong ngôn ngữ C++ thì tính đa hình có 2 dạng:
- Dạng 1 – Compile time Polymorphism: Một class có nhiều hàm cùng tên nhưng khác nhau về số lượng tham số hoặc kiểu dữ liệu của tham số. Khi gọi hàm cùng tên đó thì trong quá trình biên dịch, compiler sẽ quyết định hàm nào (trong số các hàm cùng tên) sẽ được gọi dựa trên số lượng tham số và kiểu dữ liệu của tham số truyển vào hàm. Việc định nghĩa các hàm cùng tên được gọi là overloading – nạp chồng hàm.
- Dạng 2 – Runtime Polymorphism: Cùng một class có thể cho ra nhiều biến thể, không phải được định nghĩa bởi lớp đó, mà bởi các lớp con của nó. Đây là một phương pháp để định nghĩa lại hành vi của lớp cơ sở mà không phải sửa code (còn gọi là Implementation) của lớp cơ sở. Nếu gọi hàm của đối tượng của lớp dẫn xuất thông qua con trỏ của lớp cơ sở thì việc hàm nào (của lớp cơ sở hay). Runtime Polymorphism được thực hiện bằng phương pháp overriding – ghi đè phương thức.
Ví dụ:
Ta có lớp data có phương thức print cùng tên nhưng tham số truyền vào thuộc các kiểu dữ liệu khác nhau. Trong hàm main, ta gọi phương thức print 3 lần nhưng mỗi lần truyền một tham số thuộc kiểu khác, khi biên dịch chương trình sẽ tự nhận biết kiểu giá trị của tham số truyền vào từ đó xác định phương thức nào trong 3 phương thức cùng tên sẽ được gọi.
Tính kế thừa (Inheritance)
Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối tượng nào cũng có tính chất này.
Lấy 1 ví dụ: Coi con người là một class, class này sẽ có các thuộc tính: tên, tuổi, … Một class sinh viên sẽ kế thừa class con người do sinh viên cũng có các thuộc tinhs: tên, tuổi, … Ngoài ra còn có thêm các thuộc tính: mã sinh viên, điểm thành phần, …
Bài viết đầu tiên của mình xin kết thúc tại đây. Rất mong mọi người đóng góp những ý kiến để bài viết của mình ngày càng hoàn thiện hơn. Cảm ơn tất cả. Chào tạm biệt và hẹn gặp lại mọi ngươi trong những bài viết tiếp theo của Series Hướng Đối Tượng C++ nhé.
Một số tài liệu tham khảo:
- Geeksforgeeks
- W3schools
Các bài viết trong khóa họcBài sau: Lớp Và Đối Tượng Trong C++
- Share CrocoBlock key trọn đời Download Crocoblock Free
- Cung cấp tài khoản nghe nhạc đỉnh cao Tidal Hifi – chất lượng âm thanh Master cho anh em mê nhạc.
- Quy đổi 1 newton bằng bao nhiêu kg? – NB Concept
- Yobit là gì? Hướng dẫn đăng kí và trade coin trên sàn Yobit
- Nhiệt độ CPU bao nhiêu là tốt? Cách duy trì nhiệt độ CPU ổn định – Fptshop.com.vn
- Cách ẩn và hiển thị lại bài viết trên Instagram mà không cần xoá
- Bán Tài Khoản Linkifier (Get filehost) Giá 400k/3 tháng – 700k/6 tháng