友元类和内部类都是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;
}