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();     
    };    
  • 相关阅读:
    C# 用this修饰符为原始类型扩展方法
    windows7命令行终端获取管理员模式随笔
    C语言---斐波那契问题
    C语言--pow()函数实现
    数组排序之选择排序
    求数组逆置(数组与指针实现)
    字符串函数之Strtok()函数
    for循环的灵活性
    C语言--isspace()函数实现
    异构无线网络之QOS简介
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3304971.html
Copyright © 2011-2022 走看看