【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;
};

内部类

内部类是一个类B包含在另一个类A中,B是A的内部类。
注意事项:

1.B可以用A的私有成员,A不能访问B的。
2.B不属于A,是一个独立的类,写在里面仅表示他们的调用关系。
3.内部类不受外部类限定词(public等)限制。
4.外部类的static,枚举,内部类可以直接访问,不需要类名,对象名。

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