フレンド関数

2019年5月7日
C++
#include <iostream>
using namespace std;

class myclass {
  int n, d;
public:
  myclass(int i, int j) { n = i; d = j; }
  // myclassのフレンドを宣言する
  friend int isfactor(myclass ob);
};

/* ここでフレンド関数を定義する
   この関数は、dがnの因数であれば真を返す
   isfactor()関数の定義では、
   friendキーワードを使用していないことに注意
*/
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;
}
$ g++ sample18.cpp
$ ./a.out
2は10の因数
3は13の因数ではない

もう一つの例

#include <iostream>
using namespace std;

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);
};

/* carの速度がtruckよりも速い場合は、正の値を返す
   速度が同じであれば、0を返す
   truckの速度がcarよりも速い場合は、負の値を返す
*/
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とt1を比較:\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;
}
$ g++ sample19.cpp
$ ./a.out
c1とt1を比較:
乗用車とトラックのスピードは同じ

c2とt2を比較:
乗用車が速い