フレンド関数というものがあります。フレンド関数を定義すると、そのクラスのアクセス指定子に関わらず全てのメンバ(変数・メソッド等)にアクセスできるようになるというものです。
例えれば、セールスマン等の訪問者は家に入れても家の物を触らせたりしませんが、友達はゲームや漫画などいろいろな家のものを触ったりする。
本やWebにもこの類の説明が書かれていますが、どんな時に使うとか有用性があまり書かれていない…。
2つ以上のクラスのprivateメンバにアクセスする時に役立つと一部書いてありましたが、わざわざカプセル化の機能を崩してまでやる事なのか。ゲッターとかメソッドを介して取得するとか他の方法を検討すべきなんじゃないのかとか思いました。いまいちメリットが見出せず。
知り合いのSEに聞いたんですが、まず使わないそうです。
なにやらちょっと異質な機能ではありますよね。
フレンド関数はクラスのメンバ関数ではないためオブジェクトからの呼び出しや継承などができないという特徴がありますので、デバッグ用などのかなり限られた用途に絞られそうな気がします。
#もしくは裏技的な動作がどうしても必要になった時とか…
似たようなものにフレンドクラスというものもあるそうですが、こちらも通常は使わないでしょうね…。
正直、もうぜんぜん覚えてないけど覚えてる限りで。
friendの真価はアクセスの密閉化にあるんだけどね。
メソッドを介してしまうとそこから得られる値はpublicな物になってしまうけど、例えばすべてのメンバをprivateにしてfriend指定することよって、指定したクラス以外からアクセスできないようにする事ができる。
つまり関数やクラスにおけるfriendはアクセスするため、ではなく不必要にアクセスさせないために利用すべき。
>hogehogeさん
friend関数が絶対必要なケースは思いつかないとの事でした。
出力演算子のオーバーロード時にはfriend指定が必要なようです。
>フジモトさん
なるほど、全てをprivateにしたらfriend指定したものからしかアクセスできないというわけですか。
逆の発想ですね。
すでにフジモトさんが言ってますけど、friendは隠蔽度を上げるためのものですよ。よく誤解されてますが…。
ゲッターとかメソッドを介してしまうと、誰でもアクセスできるようになってしまいますよね。そっちのほうがfriendよりもずっと危険だと判断するときにfriendを使うわけです。publicはfriendよりも相手をコントロールできないぶん危険で怖いってことですね。