通常,类的共有方法提供了对类对象私有部分唯一的访问途径。
友元有三种:
- 友元函数
- 友元类
- 友元成员函数
友元函数
友元函数在类的声明中声明,在声明前加上friend关键字。
friend Time operator*(double m, const Time & t);
- 虽然operator*()函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用;
- 虽然operator*()函数不是成员函数,但它与成员函数的访问权限相同。
常用的友元:重载<<运算符
class Time
{
private:
int hours;
int minutes;
public:
...
friend ostream & operator<<(ostream & os, const Time & t); //声明
};
...
//友元函数定义不使用Time::限定符,因为友元函数不是成员函数。
ostream & operator<<(ostream & os,const Time & t)
{
os<<h.hours<<" hours, "<<t,minutes<<" minutes";
return os;
}
友元类
一个类A可以把另一个类B声明为自己的友元,类B的所有成员函数就都可以访问A类对象的私有成员。
- 友元声明可以位于公有、私有或保护部分,其所在位置无关紧要。
友元成员函数
可以选择仅让特定的类成员成为另一个类的友元,而不必让整个类成为友元。
- 注意:必须小心排列各种声明和定义的顺序。
假设让Remote::set_chan()成为Tv类的友元,在Tv类声明中将其声明为友元:
class Tv
{
friend void Remote::set_chan()(Tv & t, int c);
...
};
然而,友元声明和友元定义之间相互依赖,必须使用前向声明避开这种循环依赖,排列顺序如下:
class Tv; //前向声明
class Remote { ... };
class Tv { ... };
必须先定义包含成员函数的类,才能将成员函数设为友元。