C++のフレンド関数とフレンドクラスの基本を解説
C++におけるフレンド関数(friend function)とは、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。
フレンド関数のプロトタイプ(宣言)はクラス定義の中に記述しますが、あくまで「友達」として扱われるだけであり、クラスのメンバー関数にはなりません。この点は重要なポイントです。
フレンドとして指定できるもの
フレンドとして宣言できるのは、以下のようなものです。
- 通常の関数
- 関数テンプレート
- 他のクラスのメンバー関数
- クラス全体(この場合、そのクラスのすべてのメンバーがフレンドになります)
- クラステンプレート
フレンド関数の宣言方法
ある関数をクラスのフレンドとして宣言するには、クラス定義内の関数プロトタイプの先頭に friend キーワードを付けるだけです。
class Box {
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};また、クラス ClassTwo のすべてのメンバー関数を、クラス ClassOne のフレンドとして宣言したい場合は、ClassOne の定義内に次の1行を追加します。
friend class ClassTwo;
実装例
ここでは、フレンド関数を使ってクラスのプライベートメンバーに直接アクセスする具体的なサンプルコードを見てみましょう。
#include <iostream>
using namespace std;
class Box {
double width;
public:
friend void printWidth( Box box );
void setWidth( double wid );
};
// メンバー関数の定義
void Box::setWidth( double wid ) {
width = wid;
}
// 注意: printWidth() はどのクラスのメンバー関数でもない
void printWidth( Box box ) {
/* printWidth() はBoxクラスのフレンドであるため、
このクラスの任意のメンバーに直接アクセスできる */
cout << "Width of box : " << box.width << endl;
}
// プログラムのmain関数
int main() {
Box box;
// メンバー関数を使って幅を設定
box.setWidth(10.0);
// フレンド関数を使って幅を出力
printWidth( box );
return 0;
}実行結果
上記のコードを実行すると、次の出力が得られます。
Width of box: 10
まとめ
この例からわかるように、printWidth() は Box クラスのメンバー関数ではないにもかかわらず、そのクラスのメンバー変数 width に直接アクセスできています。
フレンド機能を使うとカプセル化の一部が緩和されるため乱用は避けるべきですが、演算子のオーバーロードなど、特定の場面では非常に便利で強力な機能です。適切に活用することで、より柔軟で読みやすいC++コードを書くことができます。
-
C++のクラスとオブジェクトとは?基本概念と定義方法を初心者向けに解説
クラスは、C++における最も重要な機能の一つです。オブジェクト指向プログラミング(OOP)の中核となる概念を実現するためのユーザー定義型であり、データ変数と、そのデータを操作するための関数を1つのパッケージにまとめることができます。クラスは、オブジェクトの設計図(仕様)を提供する役割を担います。クラスの定義方法クラスの定義は「class」キーワードから始まり、その後にクラス名を記述します。続いて、波括弧({})で囲まれたクラス本体を定義し、末尾に必ずセミコロン(;)を付けます。C++におけるクラス定義の基本的な例は以下の通りです。class Student { &nbs
-
C++のfriend(フレンド)関数とは?必要になる場面と使い方を解説
C++におけるfriend(フレンド)関数は、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ宣言はクラス定義内に記述しますが、あくまで「宣言」だけであり、フレンド関数自体はそのクラスのメンバ関数にはなりません。 フレンドとして指定できるのは、通常の関数だけでなく、関数テンプレート、メンバ関数、さらにはクラスやクラステンプレートも可能です。クラスをフレンドとして指定した場合、そのクラス全体とそのすべてのメンバがフレンドとなります。 friend関数の宣言方