类的私有成员只能通过它的成员函数来访问。友元函数是一扇通往私有成员的后门。
友元可以是:
- 一般函数(友元函数)
- 另一个类的成员函数(友元成员)
- 整个类(友元类)
友元关系是授予的而不是索取的。也就是说,如果函数 f 要成为类A的友元,类A必须显式声明函数f是他的友元,而不是函数f自称是类A的友元。
友元关系不是对称关系,如果类A声明了类B是它的友元,并不意味着类A也是类B的友元。
友元关系不是传递关系。如果类A是类B的友元,类B是类C的友元,并不意味着类A是类C的友元。
1.友元函数
在类定义中用关键词friend声明友元函数,声明位置:可声明在public部分,也可声明在private部分。一个较好的程序设计的习惯是将所有的友元关系的声明放在最前面的位置,并且不要在它的前面添加任何访问控制说明。
友元函数是一个全局函数,可以定义在类中,也可以定义在类外,不管定义在哪里,都不是类的一部分,
//友元函数声明
friend 返回类型 函数名(参数表);
//定义在类内
class girl {
char name[10];
int age;
public:
girl(char *n, int d)
{ strcpy(name,n); age=d; }
friend void disp(girl &x)
{ cout<<x.name<<“ “
<<x.age<<endl;}
};
void main()
{ girl e("abc", 15); disp(e); }
//定义在类外
class girl {
char name[10];
int age;
public:
girl(char *n, int d)
{ strcpy(name,n);
age=d;}
friend void disp(girl &x);
};
void disp(girl &x)
{ cout<<x.name<<" “<<x.age<<endl; }
void main()
{ girl e("abc", 15);
disp(e); }
2.友元成员函数
如果要将类B的成员函数int func(double);
声明为类A的友元,可在类A的定义中加入:
friend int B::func(double);
3.友元类
整个类作为另一个类的友元。当A类被说明为类B的友元时,类A的所有函数都是类B的友元函数
class Y;
class X{
…
friend Y;//或friend class Y
……};