【C++】フレンド関数
- 関数をクラスのメンバにすることなく、関数からクラスの非公開メンバにアクセスすることができる
- 1つの関数から、2つ以上のクラスの非公開メンバにアクセスしたい時などに使われる。
- クラスの宣言の内部にfriendを先頭につけて関数のプロトタイプを含める
stdudy96.cpp
#include <iostream> using namespace std; class myclass { int n, d; public: myclass( int i, int j ) { n = i; d = j; } friend int isfactor( myclass ob ); }; int isfactor( myclass ob ) { if( !( ob.n % ob.d ) ) return 1; else return 0; } int main() { myclass ob1(10, 2), ob2(13, 3); if ( isfactor( ob1 ) ) cout << "2は10の因数\n"; else cout << "2は10の因数ではない\n"; if ( isfactor( ob2 ) ) cout << "3は13の因数\n"; else cout << "3は13の因数ではない\n"; return 0; }
$ ./study96 2は10の因数 3は13の因数ではない
- isfactor()はmyclassのフレンドなので、myclassの非公開メンバにアクセスできる
- ob.nとob.dの両方を直接参照できる
- クラスメンバアクセス演算子(ドット演算子やアロー演算子)を使用してフレンド関数を呼び出すことはできない
- フレンド関数は継承されない
- 複数のクラスのフレンドになることができる
stdudy98.cpp
#include <iostream> using namespace std; class car; class truck; class car { int passengers; int speed; public: car ( int p, int s ) { passengers = p; speed = s; } friend int sp_greater( car c, truck t ); }; class truck { int weight; int speed; public: truck ( int w, int s ) { weight = w; speed = s; } friend int sp_greater( car c, truck t ); }; int sp_greater ( car c, truck t ) { return c.speed - t.speed; } int main() { int t; car c1(6, 55), c2(2, 120); truck t1(10000, 55), t2(20000, 72); cout << "c1とc2を比較\n"; t = sp_greater( c1, t1 ); if ( t < 0 ) cout << "トラックが速い\n"; else if ( t == 0 ) cout << "乗用車とトラックの速度は同じ\n"; else cout << "乗用車が速い\n"; cout << "\nc2とt2を比較:\n"; t = sp_greater( c2, t2 ); if ( t < 0 ) cout << "トラックが速い\n"; else if ( t == 0 ) cout << "乗用車とトラックの速度は同じ\n"; else cout << "乗用車が速い\n"; return 0; }
$ ./study98 c1とc2を比較 乗用車とトラックの速度は同じ c2とt2を比較: 乗用車が速い
プログラムの通り。