友元
一、简介
- 友元是一种允许非类的成员函数访问该类的私有成员的一种方式。我们常用的方式用两种—友元函数,友元类。
-
友元函数
友元函数是可以访问类的私有成员的函数。他一般是在类外定义的全局函数,不属于任何类。子啊使用前,需要在待访问的类中申明。声明时需要加上friend关键字。
格式:friend 数据类型 函数名(类型1 参数1…)
(在相应的类中申明)
class Animal{
private:
char sex;
int age;
public:
Animal(char s,int a){
sex = s;
age = a;
}
friend void show(Animal &obj); //声明该函数为该类的友元。
};
//全局函数
void show(Animal &obj)
{
cout << "SEX = " << obj.sex << endl;
cout << "AGE = " << obj.age << endl;
}
int main()
{
Animal al('m',2);
show(al);
}
-
友元类
若是一个类A会频繁的访问另一个类B中的私有成员,那么我们可以把B的私有权限向
A进行开发,这个开放方式,我们就叫做友元类。及B把A当作好朋友,A可以访问B
中任何的数据。但是友元不具有传递性,友元为单向开放权限。格式:friend class 类名;
[注意:该类一定要存在,在代码中某个地方定义过]
class girl; //声明girl类
class Person{
private:
string name;
int age;
public:
void show(){
xxx.
}
friend class girl;
};
class girl{
private:
char sex;
int hair_len;
public:
void show(Person &p){
cout << "NAME\tAGE\tSEX\tHAIR_LEN" << endl;
//cout << p.name << endl;
}
};
【如上面这段代码中,在申明类girl为类Person的友元时,需要先对girl进行申明,因为它的定义在类person的后面,需要告诉编译器让编译器去找到该类】
【特点】
- 友元关系是单向的,不具备交换性。(如:我把你当好朋友,你不一定把我当做好朋友)
- 友元函数不具备传递性(如:你是我的好朋友,但是你的好朋友不一定是我的好朋友)