Định nghĩa
Từ khóa
Trong C++, từ khóa để định nghĩa một lớp là class, cách sử dụng tương tự như struct trong C. Nội dung bên trong lớp được gọi là thành viên của lớp: biến trong lớp được gọi là thuộc tính hoặc biến thành viên, hàm trong lớp được gọi là phương thức hoặc hàm thành viên (hàm thành viên được định nghĩa trực tiếp trong lớp mặc định là inline).
Một điểm khác biệt quan trọng là trong C++, bạn có thể định nghĩa hàm thành viên trong lớp, điều này không thể thực hiện với struct trong C. Tuy nhiên, trong C++, struct cũng đã được nâng cấp để có thể sử dụng như class, nhưng thông thường, class vẫn được sử dụng phổ biến hơn.
class SinhVien
{
public:
void hienThi()
{
std::cout << ten << " " << soHieu << " " << tuoi << std::endl;
}
private:
std::string ten;
int soHieu;
int tuoi;
};
Giới hạn truy cập
C++ cung cấp ba mức độ truy cập cho các thành viên của lớp: public, protected, và private.
- Thành viên được đánh dấu là public có thể được truy cập trực tiếp từ bên ngoài lớp.
- Thành viên được đánh dấu là protected hoặc private không thể được truy cập trực tiếp từ bên ngoài lớp.
Nếu một thành viên của lớp không được chỉ định mức độ truy cập, nó sẽ mặc định là private trong class và public trong struct. Thông thường, các biến thành viên sẽ được đặt ở mức độ protected hoặc private, trong khi các hàm cần sử dụng từ bên ngoài sẽ được đặt ở mức độ public.
Phạm vi lớp
Lớp tạo ra một phạm vi mới, tất cả các thành viên của lớp đều nằm trong phạm vi này. Nếu muốn định nghĩa hàm thành viên bên ngoài lớp, cần thêm dấu hai chấm (::) trước tên hàm và chỉ rõ lớp mà hàm đó thuộc về.
Phạm vi lớp ảnh hưởng đến cách biên dịch tìm kiếm hàm. Nếu không có dấu ::, biên dịch sẽ coi hàm đó là hàm toàn cục, dẫn đến lỗi vì không tìm thấy các biến liên quan. Thêm TenLop:: giúp biên dịch biết rằng hàm được định nghĩa thuộc về lớp cụ thể nào.
class SinhVien
{
public:
void hienThi();
private:
std::string ten;
int soHieu;
int tuoi;
};
// Định nghĩa hàm thành viên bên ngoài lớp
void SinhVien::hienThi()
{
std::cout << ten << " " << soHieu << " " << tuoi << std::endl;
}
Thực thể hóa
Khái niệm
Quá trình tạo đối tượng từ lớp trong bộ nhớ vật lý được gọi là thực thể hóa. Lớp là khái niệm trừu tượng, chỉ định các biến thành viên, nhưng chúng chỉ được khai báo, chưa được phân bổ bộ nhớ. Chỉ khi thực thể hóa, bộ nhớ mới được phân bổ cho các biến thành viên.
Một lớp có thể tạo ra nhiều đối tượng, và chỉ những đối tượng này mới chiếm bộ nhớ để lưu trữ các biến thành viên.
#include <iostream>
using namespace std;
class SinhVien
{
public:
void hienThi()
{
cout << ten << " " << soHieu << " " << tuoi << endl;
}
private:
string ten;
int soHieu;
int tuoi;
};
int main()
{
SinhVien sv; // Thực thể hóa đối tượng sv
return 0;
}
Kích thước bộ nhớ
Khi đối tượng được thực thể hóa, các biến thành viên được lưu trữ trong đối tượng, trong khi các hàm thành viên chỉ là đoạn mã lệnh, không được lưu trữ trong đối tượng. Trong C++, việc thực thể hóa đối tượng cũng tuân theo quy tắc căn chỉnh bộ nhớ (tương tự như struct).
Ví dụ:
struct S1
{
char c1;
int i;
char c2;
};
int main()
{
printf("%d\n", sizeof(S1));
return 0;
}
Kết quả đầu ra là 12. Bảng dưới đây giải thích tại sao:
c1(1 byte) ở vị trí 0i(4 bytes) căn chỉnh đến vị trí 4c2(1 byte) căn chỉnh đến vị trí 8- Tổng kích thước phải là bội số của giá trị căn chỉnh lớn nhất (4), nên là 12.
Con trỏ this
Con trỏ this là con trỏ ẩn trong mỗi hàm thành viên, chỉ đến đối tượng hiện tại. Nó giúp hàm thành viên truy cập các thành viên của đối tượng mà nó đang hoạt động.
class SinhVien
{
public:
void hienThi()
{
cout << this->ten << " " << this->soHieu << " " << tuoi << endl;
}
private:
string ten;
int soHieu;
int tuoi;
};