Từ khóa bạn bè của người dùng được dùng để làm gì?


11

Bạn có thể giải thích cho tôi tại sao friendtừ 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?


1
Nếu bạn hỏi tại sao 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?
Benjamin Bannier

@honk "Preferred" có thể là từ sai khi sử dụng ở đây. Tôi đã chỉnh sửa hầu hết các bài đăng để sửa lỗi ngữ pháp và không có gì cả và tôi giữ nguyên lựa chọn từ gốc, nhưng tôi nghĩ có thể có một rào cản ngôn ngữ ở đây.
Adam Lear

Tôi không biết vì tôi tình cờ đọc về bạn bè ngày hôm nay. và bài báo nói rằng nếu tôi không sử dụng bạn bè, tôi sẽ tạo một lớp học đơn điệu.
Dalton

Câu trả lời:


17

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.


Nếu bạn có thể truy cập công khai dữ liệu (ví dụ thông qua một getter), bạn có sử dụng chức năng miễn phí không?
Ioanna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.