Bạn có thể giải thích cho tôi tại sao friend
từ khóa được ưa thích để trao quyền truy cập vào dữ liệu riêng tư của lớp không?
Bạn có thể giải thích cho tôi tại sao friend
từ khóa được ưa thích để trao quyền truy cập vào dữ liệu riêng tư của lớp không?
Câu trả lời:
Friend là cách cổ điển để mở rộng giao diện của một lớp.
Nhưng điều tuyệt vời là người bạn đó ghi lại rõ ràng ý định của bạn để ràng buộc chặt chẽ các mục cụ thể với một lớp.
Lưu ý: Bằng cách sử dụng bạn bè, bạn đang ràng buộc chặt chẽ bạn bè với lớp.
Một ví dụ hoàn hảo là các toán tử luồng trong C ++
class Plop
{
private:
int value;
friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
friend std::istream& operator>>(std::istream& stream, Plop& data);
};
std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop& data)
{
return stream >> data.value;
}
Ở đây chúng tôi đang mở rộng giao diện chung của lớp Plop theo cách cho phép chúng tôi truyền đối tượng vào và ra khỏi luồng, nhưng không làm lộ thực hiện bên trong hoặc gây ra đau đầu triển khai trong tương lai bằng cách yêu cầu sử dụng các phương thức get / set phải được duy trì (vì chúng sẽ là một phần của giao diện công cộng) ngay cả khi việc triển khai nội bộ bị thay đổi.
Lưu ý: Điều này KHÔNG phá vỡ đóng gói nhưng nó liên kết chặt chẽ các toán tử luồng với việc triển khai lớp Plop (tức là mọi thay đổi đối với việc triển khai lớp Plop sẽ yêu cầu thay đổi đối với việc triển khai các toán tử luồng). Nhưng điều này được mong đợi. Tất cả các phần của giao diện công cộng (bao gồm các phương thức công khai / được bảo vệ) bị ràng buộc chặt chẽ với việc thực hiện.
Nhưng Lưu ý: Bạn đã ghi lại rõ ràng ràng buộc này như là một phần của khai báo lớp.
Lưu ý: Tôi sẽ không đề cập đến bạn bè là cách ưa thích để lộ dữ liệu riêng tư. Việc sử dụng quá nhiều bạn bè có thể cũng tệ như phơi bày việc thực hiện. Giống như tất cả các tính năng ngôn ngữ, nó nên được sử dụng thận trọng.
friend
được ưa thích, bạn thường sử dụng những cách nào khác để truy cập dữ liệu của lớp tư nhân từ bên ngoài?