Trong hướng dẫn này, chúng ta sẽ tìm hiểu về đóng gói trong C ++ với sự trợ giúp của các ví dụ.
Đóng gói là một trong những tính năng chính của lập trình hướng đối tượng. Nó liên quan đến việc đóng gói các thành viên dữ liệu và các chức năng bên trong một lớp duy nhất.
Việc kết hợp các thành viên và chức năng dữ liệu tương tự bên trong một lớp lại với nhau cũng giúp ẩn dữ liệu.
Đóng gói C ++
Nói chung, đóng gói là một quá trình gói các mã tương tự vào một nơi.
Trong C ++, chúng ta có thể nhóm các thành viên dữ liệu và các hàm hoạt động cùng nhau bên trong một lớp duy nhất. Ví dụ,
class Rectangle ( public: int length; int breadth; int getArea() ( return length * breadth; ) );
Trong chương trình trên, hàm getArea()
tính diện tích hình chữ nhật. Để tính diện tích, nó cần chiều dài và chiều rộng.
Do đó, các thành viên dữ liệu (chiều dài và chiều rộng) và hàm getArea()
được giữ cùng nhau trong Rectangle
lớp.

Ví dụ 1: Đóng gói C ++
// Program to calculate the area of a rectangle #include using namespace std; class Rectangle ( public: // Variables required for area calculation int length; int breadth; // Constructor to initialize variables Rectangle(int len, int brth) : length(len), breadth(brth) () // Function to calculate area int getArea() ( return length * breadth; ) ); int main() ( // Create object of Rectangle class Rectangle rect(8, 6); // Call getArea() function cout << "Area = " << rect.getArea(); return 0; )
Đầu ra
Diện tích = 48
Trong ví dụ trên, chúng ta đang tính diện tích của một hình chữ nhật.
Để tính toán diện tích, chúng ta cần hai biến: chiều dài và chiều rộng và một chức năng: getArea()
. Do đó, chúng tôi đã gộp các biến này và hoạt động bên trong một lớp duy nhất có tên là Rectangle.
Tại đây, các biến và hàm cũng có thể được truy cập từ các lớp khác. Do đó, đây không phải là ẩn dữ liệu .
Đây chỉ là sự đóng gói . Chúng tôi chỉ giữ các mã tương tự với nhau.
Lưu ý: Mọi người thường coi đóng gói là ẩn dữ liệu, nhưng điều đó không hoàn toàn đúng.
Đóng gói đề cập đến việc đóng gói các trường và phương thức liên quan lại với nhau. Điều này có thể được sử dụng để đạt được ẩn dữ liệu. Bản thân việc đóng gói không phải là ẩn dữ liệu.
Tại sao lại đóng gói?
- Trong C ++, tính năng đóng gói giúp chúng ta giữ các dữ liệu và chức năng liên quan lại với nhau, điều này làm cho mã của chúng ta sạch hơn và dễ đọc.
- Nó giúp kiểm soát việc sửa đổi các thành viên dữ liệu của chúng tôi.
Hãy xem xét một tình huống mà chúng ta muốn trường độ dài trong một lớp là không âm. Ở đây chúng ta có thể đặt biến độ dài thành riêng tư và áp dụng logic bên trong phương thứcsetAge()
. Ví dụ,
class Rectangle ( private: int age; public: void setLength(int len) ( if (len>= 0) length = len; ) );
- Các hàm getter và setter cung cấp quyền truy cập chỉ đọc hoặc chỉ ghi cho các thành viên trong lớp của chúng tôi. Ví dụ,
getLength() // provides read-only access setLength() // provides write-only access
- Nó giúp tách các thành phần của một hệ thống. Ví dụ, chúng ta có thể đóng gói mã thành nhiều gói.
Các thành phần (gói) được tách rời này có thể được phát triển, thử nghiệm và gỡ lỗi một cách độc lập và đồng thời. Và bất kỳ thay đổi nào trong một thành phần cụ thể không có bất kỳ ảnh hưởng nào đến các thành phần khác. - Chúng ta cũng có thể ẩn dữ liệu bằng cách sử dụng tính năng đóng gói. Trong ví dụ 1 , nếu chúng ta thay đổi biến độ dài và độ rộng thành
private
hoặcprotected
, thì quyền truy cập vào các trường này bị hạn chế.
Và, chúng được giữ ẩn khỏi các lớp bên ngoài. Đây được gọi là ẩn dữ liệu .
Ẩn dữ liệu
Ẩn dữ liệu là một cách hạn chế quyền truy cập của các thành viên dữ liệu của chúng tôi bằng cách ẩn các chi tiết triển khai. Đóng gói cũng cung cấp một cách để ẩn dữ liệu.
Chúng ta có thể sử dụng công cụ sửa đổi quyền truy cập để ẩn dữ liệu trong C ++. Ví dụ,
Ví dụ 2: Ẩn dữ liệu C ++ bằng cách sử dụng công cụ chỉ định riêng
#include using namespace std; class Rectangle ( private: // Variables required for area calculation int length; int breadth; public: // Setter function for length void setLength(int len) ( length = len; ) // Setter function for breadth void setBreadth(int brth) ( breadth = brth; ) // Getter function for length int getLength() ( return length; ) // Getter function for breadth int getBreadth() ( return breadth; ) // Function to calculate area int getArea() ( return length * breadth; ) ); int main() ( // Create object of Rectangle class Rectangle rectangle1; // Initialize length using Setter function rectangle1.setLength(8); // Initialize breadth using Setter function rectangle1.setBreadth(6); // Access length using Getter function cout << "Length = " << rectangle1.getLength() << endl; // Access breadth using Getter function cout << "Breadth = " << rectangle1.getBreadth() << endl; // Call getArea() function cout << "Area = " << rectangle1.getArea(); return 0; )
Đầu ra
Chiều dài = 8 Chiều rộng = 6 Diện tích = 48
Ở đây, chúng tôi đã tạo các biến độ dài và độ rộng private
.
Điều này có nghĩa là các biến này không thể được truy cập trực tiếp bên ngoài Rectangle
lớp.
Để truy cập các biến tư nhân, chúng tôi đã sử dụng public
các chức năng setLength()
, getLength()
, setBreadth()
, và getBreadth()
. Chúng được gọi là hàm getter và setter.
Đặt các biến ở chế độ riêng tư cho phép chúng tôi hạn chế truy cập trái phép từ bên ngoài lớp. Đây là ẩn dữ liệu .
Nếu chúng tôi cố gắng truy cập các biến từ main()
lớp, chúng tôi sẽ gặp lỗi.
// error: rectangle1.length is inaccessible rectangle1.length = 8; // error: rectangle1.breadth is inaccessible rectangle1.length = 6;