ประกาศเพื่อนใน C ++ - ความแตกต่างระหว่างสาธารณะและส่วนตัว


144

มีความแตกต่างระหว่างการประกาศฟังก์ชั่นเพื่อน / ชั้นเป็นส่วนตัวหรือสาธารณะ? ฉันดูเหมือนจะไม่พบอะไรเกี่ยวกับเรื่องนี้ทางออนไลน์

ฉันหมายถึงความแตกต่างระหว่าง:

class A
{
 public: 
      friend class B;
 };

และ

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

มีความแตกต่างหรือไม่?


29
ข้อมูลที่ผิดดังกล่าว ... บางคนไม่สมควรเป็นเพื่อนกัน ขึ้นอยู่กับคุณว่าคุณชอบเพื่อนของคุณซ่อนตัวอยู่
Tony Delroy

ฉันขอถามได้ไหมว่าเพื่อนในชั้นเรียนคือ: '(?
I Phantasm I

3
@I Phantasm - เป็นการประกาศที่อนุญาตให้อินสแตนซ์ของfriendคลาสเข้าถึงสมาชิกที่ประกาศprivateในคลาสที่ทำการประกาศ ในกรณีของตัวอย่างนี้อินสแตนซ์ของคลาส B สามารถเข้าถึงสมาชิกส่วนตัวของคลาส A
BIU


2
คำถามนี้ทำให้ฉันได้รับคะแนนมากเกินไปในเว็บไซต์นี้ เอาล่ะตอนนี้
BIU

คำตอบ:


141

ไม่ไม่มีความแตกต่าง - คุณเพียงแค่บอกว่าคลาส B เป็นเพื่อนของคลาส A และตอนนี้สามารถเข้าถึงสมาชิกที่เป็นส่วนตัวและได้รับการปกป้องได้นั่นคือทั้งหมด


5
ดังนั้นฉันเดาว่าใครก็ตามที่บอกฉันว่าไม่รู้ว่าพวกเขากำลังพูดถึงอะไร ขอบคุณ :)
BIU

แต่สำหรับวัตถุประสงค์ของเอกสารคุณจะพิจารณาfriendรายละเอียดการนำไปปฏิบัติหรือส่วนหนึ่งของส่วนต่อประสานหรือไม่
TemplateRex

1
@TemplateRex: IMO เป็นส่วนหนึ่งของส่วนต่อประสาน - มันค่อนข้างเป็นข้อเรียกร้องที่ดีว่ามีบางส่วน (แบบสุ่ม) class Friendซึ่งสามารถเข้าถึงสมาชิกส่วนตัวของคลาสปัจจุบันทั้งหมดได้
sharptooth

สำหรับคลาสสุ่มใช่ แต่บอกว่าคุณใช้งานoperator==(T, T)โดยใช้ข้อมูลส่วนตัวของสมาชิกTและใช้friendเป็นรายละเอียดการใช้งานเพื่อให้operator==สามารถปรากฏเป็นที่ไม่ใช่สมาชิก IMO มิตรภาพนี้ไม่ควรปรากฏในส่วนต่อประสานสาธารณะ (ตามที่จะถูกสร้างขึ้นโดย Doxygen เช่น)
TemplateRex

ฉันอ่านเวลาที่ผ่านมาที่นี่ใน stackoverflow ว่าคอมไพเลอร์บางคนฉันเดาว่าบางคนบั๊กกี้เก่าจะสับสนถ้ามีการประกาศเพื่อนเกิดขึ้นในพื้นที่สาธารณะ
Peregring-lk

36

ตั้งแต่ไวยากรณ์friend class Bไม่ประกาศสมาชิกของชั้นAดังนั้นมันไม่สำคัญที่คุณเขียนมันระดับเป็นเพื่อนของชั้นเรียนBA

นอกจากนี้ถ้าคุณเขียนfriend class Bในprotectedส่วนของAแล้วมันก็ไม่ได้หมายความว่าBจะสามารถเข้าถึงเท่านั้นprotectedและสมาชิกของ publicA

โปรดจำไว้เสมอว่าเมื่อBเป็นเพื่อนกับAมันแล้วมันสามารถเข้าถึงสมาชิกใด ๆของAไม่ว่าคุณจะเขียนในส่วนfriend class Bใด


3
ดังนั้นฉันเดาว่าใครก็ตามที่บอกฉันว่าไม่รู้ว่าพวกเขากำลังพูดถึงอะไร ขอบคุณ :)
BIU

-2

การประกาศของเพื่อนจะปรากฏในเนื้อหาของคลาสและให้สิทธิ์การใช้งานหรือการเข้าถึงคลาสอื่นให้กับสมาชิกส่วนตัวและได้รับการป้องกันของชั้นเรียนที่การประกาศของเพื่อนปรากฏขึ้น

เนื่องจากตัวระบุการเข้าถึงดังกล่าวไม่มีผลต่อความหมายของการประกาศของเพื่อน (สามารถปรากฏเป็นส่วนตัว: หรือในส่วนสาธารณะ: โดยไม่มีความแตกต่าง)


ตอบคำถามเจ็ดปีโดยไม่มีคำถามใหม่ โปรดอย่าทำสิ่งที่ซ้ำซ้อนมากขึ้น
MAChitgarha
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.