友元
(一)概念
友元分为友元函数和友元类;
友元会增加耦合度,破坏了封装,所以应该尽量少用;
(二)友元函数
1、声明与实现
友元函数在类内声明,加friend关键字,在类外实现
class Data
{
public:
friend ostream& operator<<(ostream& _cout, const Data& d);
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& _cout, const Data& d)
{
_cout << _year << "-" << _month << "-" << _day;
return _cout;
}
2、友元函数的好处
当我们想对输出流符号“<<”进行重载时,如果在将其写成非类成员函数,那么无法访问类的私有成员,而如果写成类的成员函数时:
class Data
{
ostream& operator<<(ostream& _cout)
{}
};
我们会发现它的参数的位置就会颠倒,后面使用时就会出现很别扭的使用情况:
Data d;
d << cout; //实际调用写法
cout << d; //我们所希望的调用写法
所以为了在调用的时候更加符合我们的习惯,就会将其定义为友元函数;
3、注意
1、友元函数不是类的成员函数;
2、友元函数不能被const修饰;
3、一个函数可以是多个类的友元函数;
(三)友元类
class Time
{
friend class Data;
private:
int _h;
int _m;
int _s;
}
Data是Time类的友元类,Data类中的所有成员函数可以访问Time类的私有成员,但是Time类不能访问Data类的私有成员;
由此我们可以看出:友元关系是单向的, 且不能传递;
当访问友元类的static成员时:必须通过对象或类来访问其友元类的static成员;
(四)内部类
1、概念
内部类就是在一个类的内部又定义了一个类;
2、注意
1、内部类天然是外部类的友元类,可以访问外部类的所有成员;但是外部类不能访问内部类的私有成员;
2、计算外部类大小时,不包含内部类的成员;
3、内部类在创建对象:A::B b;
4、访问普通成员:通过对象访问;
5、访问静态成员:直接访问;