目录
一、友元
1、友元函数
友元函数就是一个函数的声明,但是这个声明的意思就是说这个函数是这个类的朋友,因此可以访问类域里的任何一个成员。但要注意的是,这个函数本身是不属于这个类的。因此,友元函数只能在类里声明,然后在类外定义。
#include <iostream>
using namespace std;
class A
{
friend int Add(int a, int b);
public:
A()
{}
~A()
{}
private:
int _a;
int _b;
};
int Add(int a, int b)
{
A t;
return t._a + t._b; /* 由于Add是A的友元函数,因此可以在Add中访问A的所有成员 */
}
注意:
1)由于友元函数没有this指针,因此不能用const修饰
2)友元函数可以在类定义的任何地方声明,不受类访问限定符限制
3)一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用和原理相同
2、友元类
友元类也是一个声明,只不过这个声明是说这个友元类是这个类的朋友,因此友元类可以访问这个类里的所有成员。但要注意的是,友元类也仅仅只是一个声明,其本身并不属于这个类。因此在计算类的大小时不用把友元类的大小算进去。
#include <iostream>
using namespace std;
class A
{
friend class B;
public:
A()
{}
~A()
{}
private:
int _a;
int _b;
};
class B
{
public:
B()
{
A a;
a._a = 1; /* 由于B是A的友元类,所以B里可以访问A的所有成员 */
}
private:
int _c;
int _d;
};
注意:
1)友元关系不能传递。
2)友元关系是单向的,不具有交换性。
3、使用建议
因为友元能够访问甚至能改变这个类里的私有成员的值,因此友元会增加耦合度,破坏了封装,所以友元不宜多用。
二、内部类
1、什么是内部类?
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的 类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。因此,我们可以这样理解:内部类是外部类的友元。
class A
{
public:
class B /* B里可直接访问A的所有成员,但A不能不能访问B */
{
public:
private:
int _c;
int _d;
};
private:
int _a;
int _b;
};
2、内部类的特点
1)内部类可以定义在外部类的public、protected、private都是可以的。
2)注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
3)sizeof(外部类)=外部类,和内部类没有任何关系。