
関数またはクラスのどちらで使用されても、 フレンド機能は、オブジェクト指向の枠組みに対してカプセル化を弱めるため、オブジェクト指向のフレームワークに悪影響を及ぼす可能性があります。 これが、フレンド機能が賢く使用されなければならない理由です。そうでなければ、それはコードのデータ隠蔽を壊すかもしれません。
この友達機能は、 可換でも推移的でもありません。 XがYの友達であり、YがZの友達である場合、XがZの友達であることを意味しない。
比較表
比較基準 | フレンド機能 | 友達クラス |
---|---|---|
基本 | これは、クラスの非公開メンバーに非メンバー関数アクセスを許可するためにfriendキーワードと共に使用される関数です。 | 他のクラスのプライベートメンバーにアクセスするためにfriendキーワードと共に使用されるクラスです。 |
フォワード宣言 | 使用する必要があります。 | 必須ではありません。 |
つかいます | フレンド関数は、オペレータが過負荷になる状況で使用できます。 | クラスが別のクラスの上に作成されるときにフレンドクラスを使用できます。 |
フレンド機能の定義
フレンド機能は、非メンバー機能にアクセスを許可することによって、クラスの非公開メンバーおよび保護メンバーにアクセスするために使用されます。 このタイプの関数では、宣言時にフレンドリキーワードが関数名の前に使用されます。 友達機能に適用される制限条件がいくつかあります。 最初の条件は、フレンド関数が子クラスに継承されていないことです。 2番目の条件は、ストレージクラス指定子がフレンド関数に存在しない可能性があるということです。つまり、staticおよびexternとして宣言することはできません。
フレンド関数は、クラスの呼び出し側オブジェクトでは呼び出されません。 フレンド関数の例は、グローバル関数、クラスのメンバー関数、関数テンプレートはフレンド関数です。 例を使って理解しましょう。
#名前空間stdを使用します。 クラス先頭{intデータ; public:first(int i):data(i){}フレンドの無効表示(const first&a); ; void display(const first&a){cout << "data =" <フレンドクラスの定義
フレンド関数と同様に、あるクラスを別のクラスのフレンドにすることができます。これをフレンドクラスと呼びます。 友人クラスが他のクラス内で定義されているプライベートメンバーにアクセスできるようにします。 フレンドクラスは、他のクラスを継承するのではなく、他のクラス内で定義された名前にのみアクセスできることを覚えておくことが重要です。 正確には、最初のクラスのメンバーは友達クラスのメンバーになることはできません。 これらの友達クラスはめったに使われません。
フレンドクラスは複数のクラスで宣言できます。 これを使用すると、複数のフレンド関数を作成する代わりに、データメンバーと関数全体にアクセスできるフレンドクラスを作成できるので、フレンド関数の簡単な代替方法と見なされます。
#名前空間stdを使用します。 class First {//友達クラスを宣言する public:First():a(0){} void print(){cout << "結果は" << a << endl; "です。 private:int a; ; 第2クラス{public:void change(First&yclass、int x){yclass.a = x;} ;}}; int main()//出力結果は0です。結果は5です。友達機能と友達クラスの主な違い
- フレンド機能は、クラスのプライベートおよび保護されたメンバーにアクセスできる機能です。 対照的に、友達クラスはクラスのプライベートメンバーにアクセスするのを手助けするクラスです。
- フレンド関数は、そのプロトタイプをクラス内に含め、キーワードfriendで先行させることによって宣言されます。 同様に、フレンドクラスもキーワードfriendを使用して定義されます。
- 前方宣言は反対にフレンド関数の場合に使用されますが、フレンドクラスで使用する必要はありません。
結論
関数が2つ以上の独立したクラス、内部メンバーにアクセスする必要がある場合、フレンド関数が必要です。 一方、クラスが別のクラスのメンバーにアクセスする必要がある場合は、フレンドクラスが必要です。 複数メンバー関数がその関数の友達になる必要があるときは、その場合は友達クラスを使うのが良いでしょう。