1

学校で、すべての算術演算子をオーバーロードする Matrix クラスを実装する課題がありました。私がしたことは、(たとえば) += をメンバー関数として定義し、+ を += 関数を使用する非メンバー関数として定義することでした (両方とも同じファイル内にありますが、+ クラスの外にあります)。学校のスタッフも似たようなことをしましたが、'+' をフレンド関数として宣言しました (そして += の実装も使用しました)。

両方の実装が完全に機能するため、非メンバー関数では得られないのに、フレンド関数では何が得られるのかを理解しようとしています。それぞれを優先する必要があるのはいつですか?

ありがとう!ヨタム

4

3 に答える 3

4

operator+クラスのパブリックインターフェイス(メンバーなど)の観点から実装できる場合は、関数のフレンドを宣言しないことをお勧めしますoperator+=

どういうわけか、演算子を使用すると、無料の関数として実装するときに、自動的に友達として宣言する必要があると考える傾向があります。たとえば、メンバー関数として実装できないと聞くかもしれませんoperator<<(左側のオペランドがostreamであるため)。したがって、フリーフレンド関数である必要があります。実際には、プライベート/保護されたメンバーとメンバー機能にアクセスする必要がある場合にのみ、友達である必要があります。

(これは、オーバーロードされた演算子が、その特別な呼び出し構文のために、通常の関数のように感じられず、クラス定義で表現する必要のあるオペランドと何らかの魔法の結合を持っているように見えるためだと思います。)

于 2011-09-22T12:51:52.267 に答える
1

フレンドバージョンは、クラスのメンバーにアクセスできます。単純な非会員はそうではありません。これは便利です。

于 2011-09-22T12:27:09.000 に答える
1

フレンド関数の定義を読むことで、質問に対する答えが得られます。

フレンド関数は、オブジェクト指向プログラミングで使用され、外部からクラス内のプライベート データまたは保護されたデータにアクセスできるようにします。通常、クラスのメンバーではない関数はそのような情報にアクセスできません。外部クラスもできません。場合によっては、このようなアクセスがプログラマーにとって有利になることがあります。このような状況では、friend キーワードを使用して、関数または外部クラスをクラスのフレンドとして宣言できます。関数または外部クラスは、クラス内のパブリック、プライベート、または保護されたすべての情報にアクセスできます。

于 2011-09-22T12:30:17.773 に答える