1/ Chỉ định truy cập
Trong bài "Lớp và đối tượng trong C++", chỉ định truy cập được đề cập là public
, private
hoặc protected
. Chỉ định truy cập (access specifier) xác định giới hạn có thể truy cập và sửa đổi các thành phần (phương thức và thuộc tính) của lớp.
public
: các thành phần của lớp có thể truy cập từ bên ngoài lớpprivate
: không thể truy cập (hoặc xem) các thành phần từ bên ngoài lớpprotected
: các thành phần không thể được truy cập từ bên ngoài lớp, tuy nhiên, chúng có thể được truy cập trong các lớp kế thừa (các em sẽ học ở bài sau)
Lưu ý:
- Cụm từ "truy cập từ bên ngoài lớp" ở đây các em có thể hiểu là tạo một đối tượng từ lớp, rồi thao tác với các phương thức và thuộc tính mà đối tượng vừa tạo được kế thừa từ lớp.
- Cụm từ "thành phần của lớp" có nghĩa là các phương thức và thuộc tính thuộc lớp
Ví dụ về chỉ định truy cập là private
#include <iostream>
using namespace std;
class TraiCay {
private:
string ten;
};
int main() {
TraiCay mit;
mit.ten = "Xoai ne";
return 0;
}
Khi chạy, chương trình sẽ báo lỗi vì truy cập thuộc tính private từ bên ngoài lớp
‘std::string TraiCay::ten’ is private
Mặc định, tất cả các thành phần của lớp đều là private
nếu chỉ định truy cập không được khai báo.
Ví dụ:
class TinhTong {
int x; // thuoc tinh private
int y; // thuoc tinh private
};
sẽ tương đương
class TinhTong {
private:
int x; // thuoc tinh private
int y; // thuoc tinh private
};
2/ Tính đóng gói
Tính đóng gói được thể hiện qua chỉ định truy cập private
như các em đã học ở phần trên, tức không thể truy cập (hoặc xem) các thành phần của lớp từ bên ngoài lớp. Ở đây, các em sẽ học cách truy cập (hoặc xem) các phương thức và thuộc tính là private
.
Để truy cập phương thức hoặc thuộc tính private
, hãy sử dụng các phương thức public
bên trong lớp.
*Ví dụ truy cập thuộc tính là private
#include <iostream>
using namespace std;
class TraiCay {
private:
string ten;
public:
// Setter
void setTen(string s) {
ten = s;
}
// Getter
string getTen() {
return ten;
}
};
int main() {
TraiCay mit;
mit.setTen("Xoai ne");
cout << "Toi ten: " << mit.getTen();
return 0;
}
Như vậy thuộc tính ten
là private
có thể truy cập thông qua phương thức setTen
và getTen
là public
.
*Ví dụ truy cập thuộc tính và phương thức là private
#include <iostream>
using namespace std;
class TraiCay {
private:
string ten;
void inTen() {
cout << ten;
}
public:
int soLuong;
void inDsTraiCay() {
cout << "Toi ten la ";
inTen();
cout << "\n";
cout << "So luong con lai tren canh la ";
cout << soLuong;
}
public:
// Setter
void setTen(string s) {
ten = s;
}
};
int main() {
TraiCay mit;
mit.setTen("Xoai"); // ten la private
mit.soLuong = 1; // soLuong la public
mit.inDsTraiCay();
return 0;
}
Như vậy
- Thuộc tính
ten
làprivate
có thể truy cập thông qua phương thứcsetTen
làpublic
- Phương thức
inTen
làprivate
có thể truy cập thông qua phương thứcinDsTraiCay
làpublic
Tại sao lại sử dụng tính đóng gói?
Trong thực tế, các ứng dụng lớn được viết không phải bởi một lập trình viên mà bởi một nhóm lập trình viên, không chỉ có một lớp mà có nhiều lớp khác nhau rồi kết hợp lại thành một ứng dụng hoàn chỉnh. Tính đóng gói giúp các lập trình viên kiểm soát dữ liệu trong lớp tốt hơn, giảm thiểu sự phụ thuộc lẫn nhau giữa các lớp được viết riêng.
Nếu đến đây các em vẫn chưa hiểu thì cũng không sao,
vì OOP khá trừu tượng và khó hiểu các em nhé!
cứ mạnh dạn qua bài tiếp theo nào ?