フレンドクラスと内部クラスはどちらも、カプセル化を突破できるC ++によって提供されます。それらの使用法は非常に似ていますが、詳細にも違いがあります。
友元类
フレンドクラスは、フレンド関数よりもオブジェクト指向の考え方に沿っています。
定義:
フレンドクラスのすべてのメンバー関数は、別のクラスのフレンド関数にすることができ、すべてが別のクラスの非公開メンバーにアクセスできます。
特徴:
1.友情関係は一方向であり、互換性はありません。
例:クラスAは、クラスBがAの友達であると宣言し、BはAのプライベートメンバーにアクセスできますが、AはBのプライベートメンバーにアクセスできません。
2.友情は受け継がれません。
言うまでもなく、一方通行は通過できません。フレンドクラスは宣言のみを確認します。
フレンドクラスの宣言形式:
//B是A的友元类,B可以访问A的私有成员。
class A{
friend class B;
}
#include<iostream>
using namespace std;
class Date;
class Time
{
friend class Date;
public:
Time(int hour=1)
: _hour(hour)
{
}
private:
int _hour;
};
class Date
{
public:
Date(int year = 2021)
: _year(year)
{
}
void SetTimeOfDate(int hour)
{
// 直接访问时间类私有的成员变量
t._hour = hour;
}
private:
int _year;
Time t;
};
インナークラス
内部クラスは別のクラスAに含まれるクラスBであり、BはAの内部クラスです。
予防:
1. BはAのプライベートメンバーを使用でき、AはBにアクセスできません。
2. BはAに属していません。独立したクラスであり、そこに記述されているのは、それらの呼び出し関係を示すだけです。
3.内部クラスは外部クラス修飾子(パブリックなど)によって制限されません。
4.外部クラスの静的クラス、列挙型クラス、および内部クラスには、クラス名やオブジェクト名を必要とせずに直接アクセスできます。
class A
{
private:
static int staticnum;
int i;
public:
class B
{
public:
void print(const A& a)
{
cout << staticnum << endl;
//直接访问
cout << a.i << endl;
//对象名访问
}
};
};
int A::staticnum = 1;
//静态成员需要类外定义
int main()
{
//B::b;因为B在A里,要用A的类名来创建对象
A::B b;
b.print(A());
return 0;
}