C++ フレンド関数とフレンド クラス
C++ フレンド関数とフレンド クラス
このチュートリアルでは、例を使用して C++ でフレンド関数とフレンド クラスを作成する方法を学習します。
データ隠蔽は、オブジェクト指向プログラミングの基本概念です。クラス外からのプライベート メンバーのアクセスを制限します。
同様に、保護されたメンバーは派生クラスからのみアクセスでき、外部からはアクセスできません。たとえば、
class MyClass {
private:
int member1;
}
int main() {
MyClass obj;
// Error! Cannot access private members from here.
obj.member1 = 5;
}
ただし、C++ には フレンド関数 と呼ばれる機能があります。 このルールを破り、クラスの外部からメンバー関数にアクセスできるようにします。
同様に、フレンド クラスがあります。 これについては、このチュートリアルの後半で学習します。
C++ のフレンド関数
フレンド機能 プライベートにアクセスできます そして保護 クラスのデータ。 friend
を使用してフレンド関数を宣言します クラスの本体内のキーワード。
class className {
... .. ...
friend returnType functionName(arguments);
... .. ...
}
例 1:フレンド関数の動作
// C++ program to demonstrate the working of friend function
#include <iostream>
using namespace std;
class Distance {
private:
int meter;
// friend function
friend int addFive(Distance);
public:
Distance() : meter(0) {}
};
// friend function definition
int addFive(Distance d) {
//accessing private members from the friend function
d.meter += 5;
return d.meter;
}
int main() {
Distance D;
cout << "Distance: " << addFive(D);
return 0;
}
出力
Distance: 5
ここで、addFive()
プライベート両方にアクセスできるフレンド機能です と一般公開 データ メンバー。
この例は、フレンド機能の概念についてのアイデアを与えてくれますが、意味のある使い方は示していません。
より意味のある使用法は、2 つの異なるクラスのオブジェクトを操作することです。そんな時、フレンド機能がとても役に立ちます。
例 2:2 つの異なるクラスのメンバーを追加する
// Add members of two different classes using friend functions
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
private:
int numA;
// friend function declaration
friend int add(ClassA, ClassB);
};
class ClassB {
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
private:
int numB;
// friend function declaration
friend int add(ClassA, ClassB);
};
// access members of both classes
int add(ClassA objectA, ClassB objectB) {
return (objectA.numA + objectB.numB);
}
int main() {
ClassA objectA;
ClassB objectB;
cout << "Sum: " << add(objectA, objectB);
return 0;
}
出力
Sum: 13
このプログラムでは、 ClassA
と ClassB
add()
を宣言しました フレンド機能としてしたがって、この関数は private にアクセスできます 両方のクラスのデータ
ここで注目すべき点は、ClassA
内のフレンド関数です。 ClassB
を使用しています .ただし、ClassB
は定義していません。 この時点で。
// inside classA
friend int add(ClassA, ClassB);
これが機能するには、 ClassB
の前方宣言が必要です
// forward declaration
class ClassB;
C++ のフレンド クラス
friend
を使用して、C++ でフレンド クラスを使用することもできます。 キーワード。たとえば、
class ClassB;
class ClassA {
// ClassB is a friend class of ClassA
friend class ClassB;
... .. ...
}
class ClassB {
... .. ...
}
クラスがフレンド クラスとして宣言されると、フレンド クラスのすべてのメンバー関数がフレンド関数になります。
ClassB
以降 はフレンド クラスです。ClassA
のすべてのメンバーにアクセスできます。 ClassB
の中から .
ただし、ClassB
のメンバーにはアクセスできません。 ClassA
の中から .これは、C++ でのフレンド関係が付与されるだけであり、取得されないためです。
例 3:C++ フレンド クラス
// C++ program to demonstrate the working of friend class
#include <iostream>
using namespace std;
// forward declaration
class ClassB;
class ClassA {
private:
int numA;
// friend class declaration
friend class ClassB;
public:
// constructor to initialize numA to 12
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
// constructor to initialize numB to 1
ClassB() : numB(1) {}
// member function to add numA
// from ClassA and numB from ClassB
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
出力
Sum: 13
ここでは、ClassB
ClassA
のフレンドクラスです .つまり、ClassB
classA
のメンバーにアクセスできます .
ClassB
で 、関数 add()
を作成しました numA の合計を返します そして numB .
ClassB
以降 はフレンド クラスです。ClassA
のオブジェクトを作成できます。 ClassB
の中 .
C言語