Data Hiding là một trong những đặc điểm quan trọng của Lập trình hướng đối tượng mà cho phép ngăn cản hàm của một chương trình truy cập trực tiếp tới biểu diễn nội vi của một kiểu lớp. Giới hạn truy cập tới các thành viên lớp được xác định bởi các khu vực public, private và protected được gán nhãn bên trong thân lớp. Từ khóa public, private và protected được gọi là Access Specifier.
Một lớp có thể có nhiều khu vực public, private và protected được gán nhãn. Mỗi khu vực vẫn còn giữ hiệu quả tới khi gặp: hoặc nhãn khu vực khác hoặc dấu ngoặc đóng của thân lớp. Access Specifier mặc định cho các thành viên và các lớp là private.
class Base { public: // tai day la cac thanh vien public protected: // tai day la cac thanh vien protected private: // tai day la cac thanh vien private };
Thành viên public trong C/C++
Thành viên public là có thể truy cập từ bất cứ đâu bên ngoài lớp nhưng là bên trong một chương trình. Bạn có thể thiết lập và lấy giá trị của các biến public mà không cần các hàm thành viên, như ví dụ sau:
#include <iostream> using namespace std; class Line { public: double chieudai; void setChieuDai( double dai ); double layChieuDai( void ); }; // phan dinh nghia cac ham thanh vien double Line::layChieuDai(void) { return chieudai ; } void Line::setChieuDai( double dai ) { chieudai = dai; } // ham main cua chuong trinh int main( ) { Line line; // thiet lap chieu dai cua line line.setChieuDai(50.2); cout << "Do dai cua duong la: " << line.layChieuDai() <<endl; // thiet lap chieu dai cua line ma khong su dung ham thanh vien line.chieudai = 24.7; // Dieu nay la OK: boi vi chieudai la public cout << "Do dai cua duong la: " << line.chieudai <<endl; return 0; }
Biên dịch và chạy chương trình C/C++ trên sẽ cho kết quả sau:
Thành viên private trong C/C++
Một biến hoặc một hàm thành viên private trong C/C++ không thể được truy cập, hoặc được quan sát từ bên ngoài lớp. Chỉ có lớp và các hàm friend có thể truy cập các thành viên private trong C/C++.
Theo mặc định, tất cả thành viên của một lớp sẽ là private, ví dụ: trong lớp sau, chieurong là một thành viên private, nghĩa là, tời khi bạn gán nhãn một thành viên, nó sẽ được xem như là một thành viên private.
class Box { double chieurong; public: double chieudai; void setChieuRong( double rong ); double layChieuRong( void ); };
Thực tế, chúng ta định nghĩa dữ liệu trong khu vực private và các hàm liên quan trong khu vực public để mà chúng có thể được gọi từ bên ngoài lớp, như chương trình sau:
#include <iostream> using namespace std; class Box { public: double chieudai; void setChieuRong( double wid ); double layChieuRong( void ); private: double chieurong; }; // phan dinh nghia cac ham thanh vien double Box::layChieuRong(void) { return chieurong ; } void Box::setChieuRong( double rong ) { chieurong = rong; } // ham main cua chuong trinh int main( ) { Box box; // thiet lap chieu dai cua Box, khong su dung ham thanh vien box.chieudai = 50.2; // Dieu nay la OK: boi vi chieudai la public cout << "Chieu dai cua Box la: " << box.chieudai <<endl; // thiet lap chieu rong cua Box, khong su dung ham thanh vien // box.chieurong = 22.4; // Tao ra mot Error: boi vi chieurong la private box.setChieuRong(22.4); // Ban su dung ham thanh vien de thiet lap chieurong. cout << "Chieu rong cua Box la: " << box.layChieuRong() <<endl; return 0; }
Biên dịch và chạy chương trình C/C++ trên sẽ cho kết quả sau:
Thành viên protected trong C/C++
Một biến hoặc một hàm thành viên protected là khá tương tự như một thành viên private, nhưng nó cung cấp một lợi ích bổ sung là chúng có thể được truy cập trong các lớp con, mà được gọi là các lớp kế thừa.
Bạn sẽ học về lớp kế thừa và tính kế thừa trong chương tới. Bây giờ, bạn có thể kiểm tra ví dụ sau, tại đây, tôi đã kế thừa một lớp con SmallBox từ một lớp cha là Box.
Ví dụ sau tương tự ví dụ trên và ở đây thành viên chieurong sẽ là có thể truy cập bởi bất kỳ hàm thành viên nào của lớp kế thừa SmallBox.
#include <iostream> using namespace std; class Box { protected: double chieurong; }; class SmallBox:Box // SmallBox la mot lop ke thua cua Box. { public: void setChieuRongCon( double rong ); double layChieuRongCon( void ); }; // phan dinh nghia cac ham thanh vien cua lop con double SmallBox::layChieuRongCon(void) { return chieurong ; } void SmallBox::setChieuRongCon( double rong ) { chieurong = rong; } // ham main cua chuong trinh int main( ) { SmallBox box; // thiet lap chieu rong cua Box boi su dung ham thanh vien box.setChieuRongCon(15.3); cout << "Do rong cua Box la: "<< box.layChieuRongCon() << endl; return 0; }
Biên dịch và chạy chương trình C/C++ trên sẽ cho kết quả sau:
Do rong cua Box la: 15.3