
Tất Tần Tật Về Lập Trình Hướng Đối Tượng? (Phần 2)
Trong phần trước chúng ta đã hiểu được các khái niệm cơ bản trong lập trình hướng đối tượng. Ở phần này mình sẽ đi sâu hơn về lớp và đối tượng cùng những kiến thức xung quanh chúng nhé.
1. Lớp (class):
Như mình đã nói trong phần trước, một lớp (class) là một nhóm các đối tượng mà có các thuộc tính chung. Lớp (class) là một template hoặc bản thiết kế từ đó đối tượng được tạo.
Trong C++
, để định nghĩa một lớp ta bắt đầu bằng từ khóa class, tiếp theo đó là tên của lớp và phần thân lớp được bao bởi cặp dấu {}
. Kết thúc lớp bằng dấu ;
Vẫn là ví dụ về máy vi tính:
class Mayvitinh { // Lớp Mayvitinh
public: // Phạm vi truy cập
int chieudai; // Thuộc tính (kiểu int)
string mausac ; // Thuộc tính (kiểu string)
void moLoL(); // Phương thức (method)
void caiWin(); // Phương thức (method)
};
Về phạm vi truy cập sẽ có 3 loại chính là private, protected và public. Mình xin sẽ nói chi tiết hơn ở mục sau.
2. Đối tượng (object):
Khi một lớp (Class) được định nghĩa, chỉ có đặc tả cho đối tượng được xác định; các đối tượng sẽ không được khởi tạo, nghĩa là không có bộ nhớ hoặc lưu trữ được phân bổ cho các đối tượng thuộc lớp đó. Để sử dụng dữ liệu và các hàm truy cập được xác định trong lớp, bạn cần khai báo các đối tượng (object).
Cú pháp:
Classname Objectname;
Với ví dụ máy vi tính ta sẽ khai báo:
Mayvitinh mayAsus;
Mayvitinh mayAcer;
Đối tượng mayAsus
sẽ có các thuộc tính chieudai, mausac, chieurong … và các phương thức moLoL(), caiWin(), xoaFile() … riêng so với đối tượng mayAcer
.
Nghĩa là các dữ liệu thành viên của mayAsus
sẽ không bị thay đối khi dữ liệu thành viên của mayAcer
thay đổi và các dữ liệu thành viên của mayAcer
cũng sẽ không thể truy cập, tác động đến dữ liệu thành viên của mayAsus
.
3. Truy cập dữ liệu thành viên:
Để truy cập vào thành viên dữ liệu của đối tượng ta sử dụng toán tử truy cập thành viên trực tiếp là dấu .
Như ví dụ trên nếu muốn truy cập vào phương thức moLoL() của đối tượng mayAcer
thì cú pháp sẽ là:
mayAcer.moLoL();
Trước khi đến với ví dụ ta cần nắm một số thông tin về phạm vi truy cập:
Phạm vi truy cập là cách mà người lập trình quy định về quyền được truy xuất đến các thành phần của lớp. Trong C++ có 3 loại phạm vi chính là: private, protected, public.
Phạm vi truy cập | Ý Nghĩa |
public | Không hạn chế. Thành phần có thuộc tính này có thể được truy cập ở bất kì vị trí nào |
private | Thành phần có thuộc tính này sẽ chỉ được truy cập từ bên trong lớp. Bên ngoài lớp hay trong lớp dẫn xuất sẽ không thể truy cập được. |
protected | Thành phần có thuộc tính này sẽ có thể truy cập ở trong nội bộ lớp và trong lớp dẫn xuất. |
Dưới đây là một ví dụ về phạm vi truy cập và truy xuất dữ liệu trong OOP được viết bằng C++:
#include <bits/stdc++.h>
using namespace std;
class Mayvitinh
{
public:
string tenFolder;
int copy;
void copyFile(string tF, int cpy)
{
tenFolder = tF;
copy = cpy;
}
public:
void Xuat()
{
cout << "Folder: " << tenFolder << endl;
cout << "So luong File: " << copy << endl;
}
};
int main()
{
Mayvitinh mayAcer; // Khai báo mayAcer là 1 đối tượng trong lớp Mayvitinh
Mayvitinh mayAsus; // Khai báo mayAsus là 1 đối tượng trong lớp Mayvitinh
mayAcer.copyFile("Codelearn", 2);
/* Tại đây các bạn có thể test thử tại nhà khi chuyển phạm vi truy cập phương thức
Xuat() thành private hoặc protected, chương trình sẽ không thể thực hiện và
báo lỗi.*/
mayAcer.Xuat();
return 0;
}
Sau khi thực hiện sẽ có kết quả như sau:
*Lưu ý : Trong lớp (class), nếu ta không khai báo phạm vi truy cập thì chương trình sẽ tự động mặc định đó là private.
4. Hàm thành viên trong lớp:
Trong C++ chúng ta có 2 cách để xác định hàm thành viên:
- Xác định bên trong lớp
- Xác định bên ngoài lớp
Với ví dụ về lớp Mayvitinh
bên trên, hàm Xuat()
là một hàm được xác định bên trong lớp.
Còn để xác định một hàm thành viên bên ngoài lớp ta phải sử dụng toán tử scope ::
kèm theo đó là tên lớp và tên phương thức.
Đoạn code sau sẽ cho kết quả giống như code bên trên nhưng hàm Xuat() sẽ được xác định ngoài lớp Mayvitinh:
#include <bits/stdc++.h>
using namespace std;
class Mayvitinh
{
public:
string tenFolder;
int copy;
void copyFile(string tF, int cpy)
{
tenFolder = tF;
copy = cpy;
}
public:
void Xuat(); // khai báo hàm Xuat() trong lớp Mayvitinh
};
void Mayvitinh::Xuat() // dùng toán tử :: để gọi lại tên hàm đó và viết các câu lệnh thực hiện
{
cout << "Folder: " << tenFolder << endl;
cout << "So luong File: " << copy << endl;
}
int main()
{
Mayvitinh mayAcer; // Khai báo mayAcer là 1 đối tượng trong lớp Mayvitinh
Mayvitinh mayAsus; // Khai báo mayAsus là 1 đối tượng trong lớp Mayvitinh
mayAcer.copyFile("Codelearn", 2);
mayAcer.Xuat();
return 0;
}
Kết
Mình xin kết thúc phần này tại đây, ở phần sau chúng ta sẽ tìm hiểu về hàm khởi tạo và hàm hủy trong OOP. Các bạn nhớ theo dõi nhé.
Nếu các bạn có thắc mắc hay góp ý về bài, hãy comment bên dưới để mình cùng nhau tiến bộ hơn nhé.
Post Comment