最終更新:2026-10-12
C++ friend フレンド¶
著者について:¶
個人公式アカウント:

0.概要¶
フレンドは、通常の関数またはクラスのメンバ関数が、別のクラスのprivateメンバやprotectedメンバにアクセスする仕組みを提供します。つまり、フレンドには2つの形式があります:
(1)フレンド関数:通常の関数が、あるクラスのprivateメンバやprotectedメンバにアクセスします。
(2)フレンドクラス:クラスAのメンバ関数が、クラスBのprivateメンバやprotectedメンバにアクセスします
利点:プログラムの実行効率を高められます。
欠点:クラスのカプセル化とデータの透明性を壊します。
まとめ: - privateメンバにアクセスできる - カプセル化を壊す - フレンド関係は推移しない - フレンド関係は一方向である - フレンド宣言の形式と数は制限を受けない
1.フレンド関数¶
クラス宣言のどの領域でも宣言でき、定義はクラスの外部で行います。
注意として、フレンド関数はただの通常の関数であり、そのクラスのメンバ関数ではありません。どこからでも呼び出せ、フレンド関数の中ではオブジェクト名を通してそのクラスの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.フレンドクラス¶
フレンドクラスの宣言はそのクラスの宣言の中で行い、実装はそのクラスの外で行います。
クラス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メンバに直接アクセスする方法はありません。すなわち「フレンドのフレンド」という関係は存在しません。
関連トピック¶
- C++ 純粋仮想関数と抽象クラス | C++那些事
- C++ assert アサーション | C++那些事
- C++ ビットフィールド | C++那些事
- C 言語による C++ 多態の実現 | C++那些事
- C++ const 定数と修飾 | C++那些事
- C++ const ファミリー | C++那些事
- C++ 間接参照演算子 * | C++那些事
- C++ 初期化と代入 | C++那些事
- C++ 複数戻り値の書き方 | C++那些事
- C++ mutable キーワード | C++那些事