フレンド関数

の説明の前にちょっとだけ・・・。

これまで何度か出てきた簡易名簿クラスclass_profileを、std::stringなどを使って書き直してみる・・・。

これまで、input/outputメンバ関数を作って、一気に入力や出力をしていたが、
それだと、入出力する要素が増えたとき、input/output関数が長くなり肥大化する・・・。

これからは、set_name/get_nameメンバ関数など、各privateメンバごとにセッター/ゲッターと呼ばれるメンバ関数を作る・・・。

中身はこんなもん・・・。
これにより、各privateメンバごとに設定/取得の処理が分けられ、入出力の処理とも分けられるようになった・・・。

入力してからset_name, get_nameしてから出力・・・。
まあ、これを面倒になったとみるか、それぞれのメンバが独立していて自由度が高くなったとみるか・・・。

で、本題はここから・・・。

上記のようにすると、クラス外からprivateメンバの値にアクセスするにはゲッター/セッターを経由しないといけない・・・。
しかし、実はもうひとつprivateメンバにアクセスする方法がある・・・。

それがフレンド関数・・・。
フレンド関数は、クラス外でありながら、特定クラスのprivateメンバにアクセスできる特殊な関数・・・。

クラスメンバではない普通の関数を用意したあと、

class <クラス名>{

  friend <クラス外の関数の宣言>;

};

とすると、クラス外関数は、このクラスのprivateメンバにアクセスできる・・・。
ただ、メンバ関数ではないので、フレンド関数内からprivateメンバにアクセスするには、フレンド関数内でオブジェクトを宣言するか、引数としてオブジェクトを渡してもらうかなどしないといけない・・・。

これまでのoutputメンバ関数みたいに一斉出力するprof_outputフレンド関数を追加するには、

まず普通の関数prof_outputを定義・・・。
ここでは、引数にclass_profileのオブジェクトの参照を渡している・・・。
privateメンバに直接アクセスして出力したりしているコードが見られるが、果たして・・・。

で、

あとは、friendとしてclass_profile内に宣言をする・・・。
すると、prof_output内で引数として渡されたclass_profileオブジェクトのprofのprivateメンバにアクセスできる・・・。

上はゲッター経由でメンバごとに取得してから出力演算子で出力・・・。
下はフレンド関数を使っていて、prof_output内では直接privateメンバの内容を出力している・・・。

$ ./friend_function
name: Taro
age: 20
address: Tokyo
prof.name_ = Taro
prof.age_ = 20
prof.address_ = Tokyo
friend prof.name_ = Taro
friend prof.age_ = 20
friend prof.address_ = Tokyo
$

全く問題なくビルドできるし、問題なく実行された・・・。
じゃあ、フレンド関数はどういうとき使うんだろうか・・・?

それについては、また今度としておこう・・・。

Sample/friend_function.cpp at master · bg1bgst333/Sample · GitHub