私は現在http://www.cplusplus.comチュートリアルを進めていますが、このセクションに出くわしました: http://www.cplusplus.com/doc/tutorial/inheritance.htmlフレンド関数の主題を扱っていますおよびC++のフレンド クラス。
私の質問は、いつプログラムを作成するときに友情を使用するのが賢明ですか?
私が得た唯一の手がかりは、オブジェクトを「複製」するフレンド関数を示す記事内の例でした。
私は現在http://www.cplusplus.comチュートリアルを進めていますが、このセクションに出くわしました: http://www.cplusplus.com/doc/tutorial/inheritance.htmlフレンド関数の主題を扱っていますおよびC++のフレンド クラス。
私の質問は、いつプログラムを作成するときに友情を使用するのが賢明ですか?
私が得た唯一の手がかりは、オブジェクトを「複製」するフレンド関数を示す記事内の例でした。
Marshall Cline のC++ FAQ Liteには、これに関する非常に優れた経験則がいくつかあります。
すべてが良いですが、特に「友人はカプセル化に違反しますか?」を参照してください。それらを使用する正しい方法の例と、クラスを分割してそれらを友達として宣言するのが最適な場合.
フレンド関数は、フリー関数をクラス インターフェイスの連続部分として提示するために存在します。フリー関数がクラス インターフェイスの一部になっている場所がいくつかあります。例: 任意精度の class があるとしますBigNum
。フレンド関数のいくつかの明白な候補を次に示します。
// binary operators where BigNum isn't the left-hand operand
BigNum operator+ (int, BigNum);
BigNum operator- (int, BigNum);
// stream operators
std::ostream &operator<< (std::ostream &os, const BigNum &num);
std::istream &operator>> (std::istream &is, BigNum &num);
さて、これら 2 つの例を考えると、多くの場合、二項演算子は友達である必要はありません (たとえば、メンバー関数であり、既にフル アクセスを持っている にint + BigNum
委譲することで実装できます)。BigNum + int
ただし、それはすべて、パフォーマンスに対するニーズと、クラスのパブリック メンバー関数を通じて何を公開するかによって異なります。
フレンド クラスの優れたアプリケーションの 1 つは、Mementoデザイン パターンです。
フレンドは一般的にデータ隠蔽メカニズムに違反するため、本当に必要な場合にのみ使用する必要があります。あなたのデザインが友人に大きく依存している場合、それはおそらく何らかの形で間違っています.
友達なしではできない例は、 << および >> ストリーム演算子をオーバーライドすることです。また、フレンド クラスは、一部の設計パターンの実装でよく使用されます。「イテレータ」が思い浮かびます。