zoukankan      html  css  js  c++  java
  • 【C++札记】友元

    C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。

    友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。

    友元的使用分为三类:

    1.类外的普通函数声明为该类的友元函数。

    格式: friend 类型 函数名(形参)

    2.其他类的成员函数声明为该类的友元函数。

    格式:friend 类型 类名::函数名(形参)

    3.其他类为该类的友元类,这样类中的所有成员函数都是该类的友元函数。

    格式:friend class 类名

    代码演示:

    #include <iostream>
    
    using namespace std;
    
    class A;
    
    class B
    {
    public:
        //类B的成员函数为类A的友元函数
        void display(A &a);
    };
    
    class C
    {
    public:
        //类C是类A的友元类
        void display(A &a);
    };
    
    class A
    {
    public:
        A(int i):x(i){}
    
        int getX()
        {
            return x;
        }
    
        friend void display(A &a);
        friend void B::display(A &a);
        friend C;
    
    private:
        int x;
    };
    
    //类外普通函数为类A的友元函数
    void display(A &a)
    {
        cout << a.x << endl; //友元函数直接访问类中的私有成员
    }
    
    void B::display(A &a)
    {
        cout << a.x << endl;
    }
    
    void C::display(A &a)
    {
        cout << a.x << endl;
    }
    
    int main()
    {
        A a(18);
    
        //无法直接访问类A的私有变量x,需要通过对外提供的函数来访问
        cout << a.getX() << endl;
    
        //类B的成员函数为类的A的友元函数
        B b;
        b.display(a);
    
        //类C是类A的友元类
        C c;
        c.display(a);
    
        return 0;
    }
    

    总结:

    1.友元声明在类中,但并不属于该类的成员。

    2.友元的关系不能继承。

    3.在类的任何位置声明友元都行,不受访问权限限制。

    4.友元关系提高了程序效率,但破坏了数据的安全性。慎重使用。

    5.友元的关系是单向。如类B是类A的友元,反过来类A不一定是类B的友元,看类B中是否有声明。 

  • 相关阅读:
    Javascript online compressor
    Asp.net mvc 3 JSON post & AOP
    Javascript Clone
    LiveRTMP之对接海康、大华等IPCamera SDK进行RTMP直播推送
    H5实现视频监控网络直播时前端自动适配
    监控物联网直播时遇到iOS无法播放HLS流的问题解决
    LivePlayer RTSP/RTMP/HTTP/HLS全功能播放器
    [转载]LivePlayer实现直播抓拍
    LiveRTMP内置IPCamera实现RTMP直播摄像机功能
    使用LiveNVR实现RTSP视频监控、直播推送
  • 原文地址:https://www.cnblogs.com/woniu201/p/11694515.html
Copyright © 2011-2022 走看看