Tuyên bố kết bạn trong C ++ - sự khác biệt giữa công khai và riêng tư


142

Có sự khác biệt giữa khai báo một chức năng / lớp bạn bè là riêng tư hoặc công khai không? Tôi dường như không thể tìm thấy bất cứ điều gì về điều này trực tuyến.

Ý tôi là sự khác biệt giữa:

class A
{
 public: 
      friend class B;
 };

class A
{
 private: //or nothing as the default is private
      friend class B;
 };

Có sự khác biệt?


28
Thông tin sai lệch như vậy ... ai đó không xứng đáng làm bạn. Điều đó hoàn toàn phụ thuộc vào bạn cho dù bạn thích bạn bè của mình.
Tony Delroy

tôi có thể hỏi lớp bạn bè là gì không: '(?
Tôi Phantasm Tôi

3
@I Phantasm - đó là một tuyên bố cho phép một thể hiện của friendlớp truy cập vào các thành viên được khai báo privatetrong lớp đã khai báo. Trong trường hợp của ví dụ này, một thể hiện của lớp B có thể truy cập các thành viên riêng của lớp A
BIU


2
Câu hỏi này đã giúp tôi kiếm được quá nhiều điểm trên trang web này. Được rồi.
BIU

Câu trả lời:


139

Không, không có gì khác biệt - bạn chỉ cần nói rằng lớp B là bạn của lớp A và bây giờ có thể truy cập các thành viên riêng tư và được bảo vệ, đó là tất cả.


5
Vì vậy, tôi đoán bất cứ ai nói với tôi rằng chỉ không biết những gì họ đang nói về. Cảm ơn :)
BIU

nhưng với mục đích tài liệu, bạn sẽ xem xét một friendchi tiết triển khai hoặc một phần của giao diện?
TemplateRex

1
@TemplateRex: IMO là một phần của giao diện - đây là một tuyên bố khá mạnh mẽ rằng có một số (ngẫu nhiên) class Friendcó thể truy cập tất cả các thành viên riêng của lớp hiện tại.
sharptooth

cho lớp ngẫu nhiên, có. Nhưng giả sử bạn triển khai operator==(T, T)bằng cách sử dụng các thành viên dữ liệu riêng tư Tvà sử dụng friendlàm chi tiết triển khai để operator==có thể xuất hiện với tư cách là thành viên không. IMO, tình bạn này không nên xuất hiện trong giao diện công cộng (như sẽ được tạo bởi Doxygen, vd)
TemplateRex

Tôi đã đọc cách đây một thời gian ở đây trong stackoverflow rằng một số trình biên dịch, tôi đoán một số lỗi cũ, sẽ bị lẫn lộn nếu một tuyên bố bạn bè xảy ra trong một khu vực ngoài công cộng.
Peregring-lk

35

Vì cú pháp friend class Bkhông khai báo một thành viên của lớp A, nên việc bạn viết nó ở đâu không quan trọng, lớp Blà một người bạn của lớp A.

Ngoài ra, nếu bạn viết friend class Btrong protectedphần A, thì điều đó KHÔNG có nghĩa là chỉ Bcó thể truy cập protectedpubliccác thành viên của A.

Luôn nhớ rằng một khi Btrở thành bạn của Anó, nó có thể truy cập bất kỳ thành viên nàoA , bất kể bạn viết ở phần nào friend class B.


3
Vì vậy, tôi đoán bất cứ ai nói với tôi rằng chỉ không biết những gì họ đang nói về. Cảm ơn :)
BIU

-1

Khai báo bạn bè xuất hiện trong một lớp cơ thể và cấp một chức năng hoặc một lớp khác truy cập vào các thành viên riêng tư và được bảo vệ của lớp nơi khai báo bạn bè xuất hiện.

Vì các chỉ định truy cập như vậy không ảnh hưởng đến ý nghĩa của khai báo bạn bè (chúng có thể xuất hiện ở chế độ riêng tư: hoặc ở chế độ công khai: không có sự khác biệt).


Trả lời một câu hỏi bảy năm tuổi mà không phải là mới. Xin vui lòng lấy đi từ làm cho mọi thứ trùng lặp hơn.
MAChitgarha
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.