1. Định nghĩa lớp (class) trong OOP
Trong OOP, mỗi đối tượng đều phải thuộc về một lớp nào đó. Khi định nghĩa lớp, cần xác định tên lớp, các thuộc tính và các phương thức thuộc về lớp đó.
Cú pháp định nghĩa một lớp trong OOP với C++
Sử dụng từ khóa class
để định nghĩa một lớp với cú pháp như sau:
class <tên_lớp>{
//Định nghĩa các thành phần dữ liệu
<Phạm vi truy cập>:
<Kiểu_dữ_liệu> thuoctinh1;
<Kiểu_dữ_liệu> thuoctinh2;
<Kiểu_dữ_liệu> thuoctinh3;
...
//Định nghĩa các hàm thành viên
<Phạm vi truy cập>:
<Kiểu_trả_về> ham1(các_tham_số);
<Kiểu_trả_về> ham2(các_tham_số);
<Kiểu_trả_về> ham3(các_tham_số);
. ..
};
Trong đó,
<Phạm vi truy cập> là từ khóa xác định mức độ che dấu hay khả năng truy xuất của các thành phần trong lớp. Các từ khóa đó là private, public hoặc protected.
<Kiểu_dữ_liệu> hay <Kiểu_trả_về> là có thể là một kiểu dữ liệu bất kỳ int, float, kiểu một lớp được định nghĩa, một struct,… hoặc void.
Lưu ý: Nếu không chỉ rõ <Phạm vi truy cập> thì mặc định là private.
Ví dụ:
class Room{
public:
double length;
double breadth;
double height;
public:
double calculateArea(){
return length * breadth;
}
double calculateVolume(){
return length * breadth * height;
}
};
Khai báo lớp để định nghĩa
Trong C++, lớp có thể đặt trước hoặc sau hàm main()
, nhưng không được định nghĩa một lớp bên trong một lớp khác.
Định nghĩa lớp trước hàm main
class Circle
{
//Định nghĩa lớp trước hàm main
...
};
void main()
{
Circle c, c2;
…
}
Định nghĩa lớp sau hàm main
class Circle;//Khai báo lớp
void main()
{
Circle c, c2;
…
}
class Circle
{
//Định nghĩa lớp sau hàm main
...
};
2. Lưu ý khi khai báo thuộc tính trong lớp
Các thuộc tính trong lớp được khai báo như khai báo biến. Chúng không thể có kiểu là chính của lớp đó nhưng có thể là kiểu con trỏ của lớp này.
class Circle{
private:
int r; //Khai báo thuộc tính bán kính
Circle s; //Báo lỗi, vì x có kiểu của chính lớp định nghĩa
Circle* p; //Không báo lỗi, vì p là con trỏ
};
Các thuộc tính thường có phạm vi truy cập là private
nhằm bảo đảm nguyên lý che dấu thông tin, bảo vệ an toàn dữ liệu của lớp. Lúc này, chương trình không cho phép các hàm bên ngoài truy cập trái phép vào dữ liệu của lớp.
3. Lưu ý khi khai báo hàm trong lớp
Trong C++, các hàm trong lớp có thể được định nghĩa bên trong hoặc bên ngoài lớp.
Định nghĩa hàm bên trong lớp
class Circle{
private:
float r; //Bán kính, thành phần dữ liệu của từng đối tượng
public:
void setRadius(float bKinh){
r = bKinh;
}
float getRadius(){
return r;
}
};
Các hàm setRadius()
và getRadius()
được định nghĩa bên trong lớp.
Định nghĩa hàm bên ngoài lớp
Thường dùng trong trường hợp các lệnh trong hàm quá dài, nên viết ra ngoài lớp để định nghĩa lớp gọn gàng hơn. Cú pháp:
Kiểu_trả_về_của_hàm Tên_lớp::Tên_hàm(danh sách các tham số)
{
//Nội dung hàm
}
Toán tử ::
được gọi là toán tử phân giải miền xác định, được dùng để chỉ ra lớp mà hàm đó thuộc vào.
class Circle{
private:
float r; //Bán kính, thành phần dữ liệu của từng đối tượng
public:
float area();
};
float Circle::area(){
return 3.14 * r * r;
}
Hàm area()
được định nghĩa bên ngoài lớp.
Qua bài này, các bạn đã biết cách định nghĩa một lớp trong C++. Và các bạn nên nhớ, định nghĩa một lớp giống như tạo ra một kiểu dữ liệu mới trong chương trình. Khi chúng ta sử dụng lớp để khai báo các đối tượng thì các thuộc tính và phương thức trong lớp mới được sử dụng và cấp phát vùng nhớ để lưu trữ.