コンテンツにスキップ

最終更新:2026-10-12

C++ friend フレンド

著者について:

個人公式アカウント:

wechat

0.概要

フレンドは、通常の関数またはクラスのメンバ関数が、別のクラスのprivateメンバやprotectedメンバにアクセスする仕組みを提供します。つまり、フレンドには2つの形式があります:

(1)フレンド関数:通常の関数が、あるクラスのprivateメンバやprotectedメンバにアクセスします。

(2)フレンドクラス:クラスAのメンバ関数が、クラスBのprivateメンバやprotectedメンバにアクセスします

利点:プログラムの実行効率を高められます。

欠点:クラスのカプセル化とデータの透明性を壊します。

まとめ: - privateメンバにアクセスできる - カプセル化を壊す - フレンド関係は推移しない - フレンド関係は一方向である - フレンド宣言の形式と数は制限を受けない

1.フレンド関数

クラス宣言のどの領域でも宣言でき、定義はクラスの外部で行います。

friend <类型><友元函数名>(<参数表>);

注意として、フレンド関数はただの通常の関数であり、そのクラスのメンバ関数ではありません。どこからでも呼び出せ、フレンド関数の中ではオブジェクト名を通してそのクラスのprivateメンバやprotectedメンバにアクセスします。

具体的なコードはこちら:friend_func.cpp

#include <iostream>

using namespace std;

class A
{
public:
    A(int _a):a(_a){};
    friend int geta(A &ca);  ///< 友元函数
private:
    int a;
};

int geta(A &ca) 
{
    return ca.a;
}

int main()
{
    A a(3);    
    cout<<geta(a)<<endl;

    return 0;
}

2.フレンドクラス

フレンドクラスの宣言はそのクラスの宣言の中で行い、実装はそのクラスの外で行います。

friend class <友元类名>;

クラスBがクラスAのフレンドであるなら、クラスBはAのprivateメンバに直接アクセスできます。

具体的なコードはこちら:friend_class.cpp

#include <iostream>

using namespace std;

class A
{
public:
    A(int _a):a(_a){};
    friend class B;
private:
    int a;
};

class B
{
public:
    int getb(A ca) {
        return  ca.a; 
    };
};

int main() 
{
    A a(3);
    B b;
    cout<<b.getb(a)<<endl;
    return 0;
}

3.注意点

  • フレンド関係には継承性がありません クラスBがクラスAのフレンドであり、クラスCがクラスAを継承しているとしても、フレンドクラスBはクラスCのprivateメンバやprotectedメンバに直接アクセスする方法はありません。

  • フレンド関係には推移性がありません クラスBがクラスAのフレンドであり、クラスCがクラスBのフレンドであるとしても、フレンドクラスCはクラスAのprivateメンバやprotectedメンバに直接アクセスする方法はありません。すなわち「フレンドのフレンド」という関係は存在しません。

関連トピック

コメント