4

私は現在http://www.cplusplus.comチュートリアルを進めていますが、このセクションに出くわしました: http://www.cplusplus.com/doc/tutorial/inheritance.htmlフレンド関数の主題を扱っていますおよびC++のフレンド クラス。

私の質問は、いつプログラムを作成するときに友情を使用するのが賢明ですか?

私が得た唯一の手がかりは、オブジェクトを「複製」するフレンド関数を示す記事内の例でした。

4

5 に答える 5

5

Marshall Cline のC++ FAQ Liteには、これに関する非常に優れた経験則がいくつかあります。

すべてが良いですが、特に「友人はカプセル化に違反しますか?」を参照してください。それらを使用する正しい方法の例と、クラスを分割してそれらを友達として宣言するのが最適な場合.

于 2008-12-15T00:49:52.833 に答える
4

フレンド関数は、フリー関数をクラス インターフェイスの連続部分として提示するために存在します。フリー関数がクラス インターフェイスの一部になっている場所がいくつかあります。例: 任意精度の 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ただし、それはすべて、パフォーマンスに対するニーズと、クラスのパブリック メンバー関数を通じて何を公開するかによって異なります。

于 2008-12-15T02:07:09.353 に答える
3

フレンド クラスの優れたアプリケーションの 1 つは、Mementoデザイン パターンです。

于 2008-12-15T03:15:19.327 に答える
0

フレンドは一般的にデータ隠蔽メカニズムに違反するため、本当に必要な場合にのみ使用する必要があります。あなたのデザインが友人に大きく依存している場合、それはおそらく何らかの形で間違っています.

友達なしではできない例は、 << および >> ストリーム演算子をオーバーライドすることです。また、フレンド クラスは、一部の設計パターンの実装でよく使用されます。「イテレータ」が思い浮かびます。

于 2008-12-15T07:13:54.117 に答える