C ++でのフレンド宣言-パブリックとプライベートの違い


142

フレンド関数/クラスをプライベートまたはパブリックとして宣言することには違いがありますか?これについてオンラインで何も見つけることができないようです。

私は以下の違いを意味します:

class A
{
 public: 
      friend class B;
 };

そして

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

違いはありますか?


28
そのような誤った情報...誰かが友達になるに値しない。あなたの友人があなたのプライベートに隠されているのが好きかどうかは完全にあなた次第です。
Tony Delroy、2011年

友達クラスとは何ですか?:((?
I Phantasm I

3
@I Phantasm- friend宣言privateを行ったクラスで宣言されたメンバーにクラスのインスタンスがアクセスできるようにする宣言です。この例の場合、クラスBのインスタンスは、クラスAのプライベートメンバーにアクセスできます
BIU


2
この質問で、このサイトで非常に多くのポイントを獲得しました。大丈夫。
BIU 2014年

回答:


139

いいえ、違いはありません。クラスBはクラスAの友達であり、そのプライベートメンバーと保護されたメンバーにアクセスできるというだけです。


5
だから彼らが何を話しているのかわからなかったと私が言った人は誰でもいると思います。おかげで:)
BIU

しかし、文書化の目的でfriend、実装の詳細またはインターフェースの一部を検討しますか?
TemplateRex

1
@TemplateRex:インターフェイスの一部であるIMO- class Friend現在のクラスのすべてのプライベートメンバーにアクセスできる(ランダムな)ものがあることは非常に強い主張です。
シャープトゥース2014

ランダムクラスの場合、はい。しかし、のoperator==(T, T)プライベートデータメンバーをT使用friendして実装し、それをoperator==非メンバーとして表示できるように実装の詳細として使用するとします。IMO、この友情はパブリックインターフェイスに表示されません(Doxygenによって生成されるなど)
TemplateRex

先ほどここでスタックオーバーフローを読んだことがありますが、一部のコンパイラー(古いバグのあるもの)は、非パブリック領域内でフレンド宣言が発生すると混乱するでしょう。
Peregring-lk

35

構文friend class Bはクラスのメンバーを宣言しないため、Aどこに記述してもかまいません。クラスBはクラスのフレンドですA

また、のセクションに書き込んfriend class Bでも、がとのメンバーのみにアクセスできるという意味ではありません。 protectedABprotectedpublicA

B友達になると、どのセクションに書き込んでも、のすべてのメンバーにAアクセスできることを常に覚えておいてください。Afriend class B


3
だから彼らが何を話しているのかわからなかったと私が言った人は誰でもいると思います。おかげで:)
BIU

-1

フレンド宣言はクラス本体に表示され、関数または別のクラスに、フレンド宣言が表示されるクラスのプライベートおよび保護されたメンバーへのアクセスを許可します。

そのようなアクセス指定子は、フレンド宣言の意味には影響を与えません(それらはprivate:またはpublic:セクションに表示され、違いはありません)。


新しくなくても7年前の質問に答える。複製を多用しないでください。
MAChitgarha
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.