您的位置:首页 > 编程语言 > C语言/C++

[C++]关于友元的总结

2013-09-06 10:34 232 查看
友元就是让本该不能访问类的私有成员、保护成员的函数或者类,通过声明它为友元的方式,使得他们能够访问这些私有、保护成员。使用友元其实就是破坏封装,应尽量避免使用。

友元有多重形式,经常会造成混乱,其实总结来说,就是三种程度的破坏封装:

1、声明一个普通函数作为类的友元(最高程度破坏封装)

class INTEGER
{
private:
int num;
public:
friend void Print(const INTEGER& obj);//声明友元函数
INTEGER(){
num=999;
}
};
void Print(const INTEGER& obj)//不使用friend和类::
{
//函数体
cout<<obj.num<<endl;//输出999
}


这个友元函数相当于一个全局函数,并不是类成员函数,没有this指针。调用这个函数的时候不需类对象或类标示符,直接用函数名调用即可。但此函数可以访问类的私有变量。由于友元函数没有this指针,所以一般使用参数来传递类对象。

2、声明一个类为友元(允许一个类破坏封装)

class girl;
class boy
{
private:
int age;
public:
boy();
void disp(girl &);
};

void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数
{
cout<<x.age<<endl;
//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
//正常情况下,只允许在girl的成员函数中访问girl的私有变量
}

class girl
{
private:
int age;
friend boy;   //声明类boy是类girl的友元
public:
girl();
};


声明一个类为另一个类的友元,友元类的所有成员函数可以访问另外一个类的私有成员。

3、声明一个类的成员函数为一个类的友元(只允许该类的该函数破坏封装)

class girl;

class boy
{
private:
char *name;
int age;
public:
boy();
void disp(girl &);
};

void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数
{
cout<<"boy's name is:"<<name<<",age:"<<age<<endl;//正常情况,boy的成员函数disp中直接访问boy的私有变量
cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl;
//借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量
//正常情况下,只允许在girl的成员函数中访问girl的私有变量
}

class girl
{
private:
char *name;
int age;
friend boy::void disp(girl &);   //声明类boy的成员函数disp是类girl的友元函数
public:
girl();
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: