[C ++]フレンドクラスと内部クラスの例の分析

フレンドクラスとインナークラス


フレンドクラスと内部クラスはどちらも、カプセル化を突破できる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;
}

おすすめ

転載: blog.csdn.net/zhaocx111222333/article/details/114837927