の説明の前にちょっとだけ・・・。
これまで何度か出てきた簡易名簿クラス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