C++のfriend(フレンド)関数とは?必要になる場面と使い方を解説
C++におけるfriend(フレンド)関数は、クラスのスコープ外で定義される関数でありながら、そのクラスのすべてのprivateメンバーおよびprotectedメンバーにアクセスする権限を持つ特別な関数です。フレンド関数のプロトタイプ宣言はクラス定義内に記述しますが、あくまで「宣言」だけであり、フレンド関数自体はそのクラスのメンバ関数にはなりません。
フレンドとして指定できるのは、通常の関数だけでなく、関数テンプレート、メンバ関数、さらにはクラスやクラステンプレートも可能です。クラスをフレンドとして指定した場合、そのクラス全体とそのすべてのメンバがフレンドとなります。
friend関数の宣言方法
ある関数をクラスのフレンドとして宣言するには、クラス定義の中で関数のプロトタイプの前にfriend
class Box {
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};
クラス全体をフレンドにする場合
ClassTwoクラスのすべてのメンバ関数をClassOneクラスのフレンドにしたい場合は、ClassOneの定義内に次のように記述します。
friend class ClassTwo;
サンプルコード
以下は、friend関数を使ってクラスのprivateメンバにアクセスする具体例です。
#include <iostream>
using namespace std;
class Box {
double width; // privateメンバ
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
friend関数が必要な理由
この例では、printWidth()はBoxクラスのメンバ関数ではないにもかかわらず、クラスのprivateメンバ変数widthに直接アクセスできています。
このような仕組みが役立つ場面としては、例えば以下のようなケースが挙げられます。
- 二項演算子(
+や<<など)のオーバーロードで、左右両方のオペランドに自然にアクセスしたい場合 - 複数のクラスにまたがる処理を行うヘルパー関数を作りたい場合
- 密接に関連する2つのクラス間で内部データを共有したい場合
ただし、friend指定はカプセル化を意図的に緩める行為でもあるため、乱用せず、本当に外部アクセスが必要な場面に限定して使うことが推奨されます。
-
JavaScriptのアロー関数を使ってはいけない場面とは?オブジェクトメソッドでの落とし穴
JavaScriptのアロー関数(矢印関数)は、コードを簡潔に書ける便利な構文ですが、あらゆる場面で使えるわけではありません。特にオブジェクトのメソッドとしてアロー関数を定義するのは避けるべきです。 その理由は、アロー関数には独自のthisが存在しないためです。アロー関数は、定義された場所を取り囲むレキシカルスコープからthisの値を受け取ります。グローバルスコープで定義した場合、そのthisはオブジェクト自身ではなくwindowオブジェクトを参照します。 その結果、本来なら対象オブジェクトのプロパティに対して行うはずの設定や参照が、誤ってwindowオブジェクトのプロパティに対して実行され
-
HDMIスプリッターとスイッチの違いとは?使い分けのポイントを徹底解説
現代の映像・音声エンターテインメントの多くは、HDMIによって支えられています。SCART端子やVGAケーブルをいじくり回す時代はすでに過去のもので、HDMIケーブルを両端に差し込むだけで、すぐに視聴を始められます。 ところで、HDMIの接続管理をさらに便利にしてくれる小型デバイスが存在することをご存じでしょうか?それが「スプリッター」と「スイッチ(セレクター)」です。どちらもHDMI接続を整理し、快適なAV環境を実現するうえで重要な役割を担っています。 この記事では、それぞれの仕組みと活用方法について詳しく解説していきます。 HDMIスプリッターの使い方 HDMIスプリッターの役割はシン