LIFE LOG(ここにはあなたのブログ名)

あつあつ備忘録

ソフトやハード、時にはメカの備忘録をまとめていきます

【C++】フレンド関数

f:id:AtsuyaKoike:20190524095847p:plain:w300

  • 関数をクラスのメンバにすることなく、関数からクラスの非公開メンバにアクセスすることができる
  • 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を比較:
乗用車が速い

プログラムの通り。




引用・参考はこちら

f:id:AtsuyaKoike:20190524100759j:plain:w200
独習C++ 第4版 https://www.amazon.co.jp/dp/4798119768