zoukankan      html  css  js  c++  java
  • [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();     
    };    
  • 相关阅读:
    CH1402 后缀数组【Hash】【字符串】【二分】
    poj3974 Palindrome【回文】【Hash】【二分】
    CH1401 兔子与兔子【字符串】【HASH】
    hdu5542 The Battle of Chibi【树状数组】【离散化】
    poj3349 Snowflake Snow Snowflakes【HASH】
    poj1821 Fence【队列优化线性DP】
    poj2376 Cleaning Shifts【线段树】【DP】
    poj3171 Cleaning Shifts【线段树(单点修改区间查询)】【DP】
    CH0601 Genius ACM【倍增】【归并排序】
    logging模块
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3304971.html
Copyright © 2011-2022 走看看