friend functions c
例を使用して、C ++のフレンド関数について詳しく知る。
C ++は、データがそれを操作する関数と一緒にバンドルされて単一のユニットを形成するカプセル化の機能をサポートします。これを行うことにより、C ++は、データが操作されている関数によってのみアクセス可能であり、クラス外の誰もがアクセスできないようにします。
これは、データを保持し、データが外部に漏洩するのを防ぐC ++の際立った機能の1つです。
=> Easy C ++トレーニングシリーズをお読みください。
ただし、一部のリアルタイムアプリケーションでは、バンドルされたユニットの外部のデータにアクセスしたい場合があります。たとえば、部外者のクラスがC ++クラスのプライベートデータと保護されたデータにアクセスしたい場合があります。
C ++は、このチュートリアルで説明する「フレンド」関数またはクラスと呼ばれる特別な機能を使用して、プライベートデータおよび保護されたデータにアクセスするための機能を提供します。
学習内容:
C ++のフレンド関数
C ++のフレンド関数は、キーワード「friend」が前に付いている関数です。関数がフレンドとして宣言されると、クラスのプライベートデータメンバーと保護されたデータメンバーにアクセスできます。
以下に示すように、friend関数は、friendキーワードを前に付けてクラス内で宣言されます。
class className{ …… friend returnType functionName(arg list); };
上に示したように、friend関数は、プライベートデータメンバーと保護されたデータメンバーにアクセスするクラス内で宣言されています。この関数はコードファイルのどこにでも定義でき、キーワードfriendやスコープ解決演算子を使用する必要はありません。
プログラムにフレンド関数を実装する際に覚えておくべきいくつかのポイントがあります。
- フレンド関数は、クラスのプライベートセクションまたはパブリックセクションで宣言できます。
- オブジェクトを使用せずに、通常の関数のように呼び出すことができます。
- フレンド関数は、フレンドであるクラスのスコープにはありません。
- フレンド関数は、クラスのスコープ内にないため、クラスオブジェクトを使用して呼び出されません。
- フレンド関数は、クラスのプライベートおよび保護されたデータメンバーに直接アクセスできません。クラスオブジェクトを利用してから、ドット演算子を使用してメンバーにアクセスする必要があります。
- フレンド関数は、グローバル関数または別のクラスのメンバーにすることができます。
フレンド関数の例
フレンド関数の使用法をよりよく理解するために、プログラミング例を実装しましょう。
Windows10でjarファイルを実行する方法
#include #include using namespace std; class sample{ int length, breadth; public: sample(int length, int breadth):length(length),breadth(breadth) {} friend void calcArea(sample s); //friend function declaration }; //friend function definition void calcArea(sample s){ cout<<'Area = '< 出力:
面積= 150
上記のプログラムでは、プライベートメンバーの長さと幅のクラスサンプルがあります。長さと幅の値を初期化するパブリックコンストラクタがあります。次に、長さと幅を考慮して面積を計算するフレンド関数「calcArea」があります。
calcAreaはフレンド関数であり、クラスの一部ではないことに注意してください。 main関数では、クラスサンプルのオブジェクトを作成した後、それをcalcArea関数に渡します。この関数は、面積を計算して値を表示します。
フレンドクラス
友達機能と同じように、友達クラスもあります。フレンドクラスは、フレンドであるクラスのプライベートおよび保護されたメンバーにアクセスできます。
class A{ …… friend class B; }; class B{ …….. };
上に示したように、クラスBはクラスAのフレンドです。したがって、クラスBはクラスAのプライベートメンバーと保護されたメンバーにアクセスできます。
ただし、これは、クラスAがクラスBのプライベートメンバーと保護されたメンバーにアクセスできることを意味するものではありません。そうしない限り、友情は相互ではないことに注意してください。
同様に、クラスの友情は継承されません。これは、クラスBがクラスAのフレンドであるため、クラスAのサブクラスのフレンドではないことを意味します。
プログラミングの例を見て、フレンドクラスを示しましょう。
#include #include using namespace std; class Area{ int length,breadth,area; public: Area(int length,int breadth):length(length),breadth(breadth) {} void calcArea(){ area = length * breadth; } friend class printClass; }; class printClass{ public: void printArea(Area a){ cout<<'Area = '< 出力:
面積= 150
このプログラムには、2つのクラスがあります。長さと幅のパラメータを使用して面積を計算するクラス「面積」。フィールド、面積、長さ、および幅はすべて、クラスAreaのプライベートメンバーであることに注意してください。
次に使用されるクラスは、Areaクラスの関数calcAreaによって計算された面積を出力する「printClass」です。メンバーはプライベートなので、printClassをAreaクラスの友達にする必要があります。
それが完了したら、main関数でAreaクラスのオブジェクトを作成し、面積を計算して、そのオブジェクトをprintClassクラスのprintArea関数に渡して面積を表示します。
フレンド機能の長所/短所
フレンド関数またはクラスの利点の1つは、クラスのプライベートデータと保護されたデータにアクセスできることです。 例えば、 リンクリストを実装している場合は、リンクリストクラスをノードクラスのフレンドとして作成し、リンクリストがノードで構成されているため、そのデータにアクセスできます。
したがって、特定の状況では、フレンド関数またはクラスを使用すると有利であることがわかります。ただし、いくつかの欠点もあります。
C ++の際立った特徴の1つは、カプセル化です。つまり、データとそのデータを操作する関数をバンドルして、外部の関数やクラスがデータにアクセスできないようにします。ただし、フレンド関数またはクラスが別のクラスのプライベートメンバーにアクセスできるようにすることで、実際にはカプセル化機能が損なわれます。
これを防ぐために、フレンド関数やクラスの使用には注意が必要です。プログラムで、カプセル化を完全に損なうような多くのフレンド関数やクラスを使用しないようにする必要があります。
結論
これで、C ++のフレンド関数とクラスに関するチュートリアルは終了です。
フレンドクラスと関数を使用するときは、プログラマーに恩恵をもたらすかのように、読者は非常に注意する必要があります。また、フレンド関数とクラスを使いすぎると、プログラムのカプセル化のOOP機能が損なわれる可能性があるため注意して使用する必要があります。
次のチュートリアルでは、C ++の静的関数について詳しく学習します。
=> ゼロからC ++を学ぶには、ここにアクセスしてください。
推奨読書