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

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

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

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  
{    
privateint 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  
{    
privatechar *name;    
    int age;    
    friend boy::void disp(girl &);   //声明类boy的成员函数disp是类girl的友元函数    
public:    
    girl();     
};    
原文地址:https://www.cnblogs.com/iyjhabc/p/3304971.html