フレンド関数

http://www.geocities.jp/ky_webid/cpp/language/022.html

前回のフレンドクラスに引き続き、今回はフレンド関数の話です。

考え方は同じです。クラス全体ではなく、関数単位でフレンド化が可能となります。

やってみましょう。

#include <iostream>
using namespace std;

class CSample {
    friend int GetNum(CSample& obj);
private:
    int m_num;
public:
    CSample(int num) : m_num(num) {}
};

int GetNum(CSample& obj) {
    // フレンド関係なのでCSampleのprivateなメンバ変数にアクセスできる
    return obj.m_num;
}

int main () {
    CSample obj(200);
    
    cout << GetNum(obj) << endl;
    
    return 0;
}
$ main
200

とこのように関数単位で可能となります。

また、あるクラスの一メンバ関数をフレンド化させることもできます。

#include <iostream>
using namespace std;

class CSample;

class CSample2 {
public:
    int GetNum(CSample& obj);
};

class CSample {
    friend int CSample2::GetNum(CSample& obj);
private:
    int m_num;
public:
    CSample(int num) : m_num(num) {}
};

int CSample2::GetNum(CSample& obj) {
    // フレンド関係なのでCSampleのprivateなメンバ変数にアクセスできる
    return obj.m_num;
}

int main () {
    CSample  obj(200);
    CSample2 obj2;
    
    cout << obj2.GetNum(obj) << endl;
    
    return 0;
}

この宣言順序が大切です。じゃないとコンパイルが通りません。

初めにCSampleの前方宣言し、CSample2の宣言をし、CSampleの宣言をし、最後にCSample2の定義を行わなければなりません。

しかし、フレンドクラスよりも更に使い道がよくわかりませんねこれ。いつ使うんでしょうか。