• C++ 友元函数和友元类


    1、友元函数

    友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制
    通俗地说,友元关系就是一个类主动声明哪些其他类或函数是它的朋友,进而给他们提供对本类的访问特许。也就是说,用过友元关系,一个普通函数或者类的成员可以访问封装于另外一个类中的数据。从一定程度上讲,友元是对数据隐蔽和封装的破坏。但是为了数据共享,提高程序的效率和可读性,很多情况下这种小的破坏也是必要的
    使用友元函数计算两点间的距离:

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    class Point
    {
    public:
        Point(int xx=0,int yy=0)
        {
            X = xx;
            Y = yy;
        }
        int GetX()
        {
            return X ;
        }
        int GetY()
        {
            return Y;
        }
        friend float fDist(Point &a,Point &b);
    private:
        int X,Y;
    };
    
    
    float fDist(Point &p1,Point &p2)
    {
        double x = double(p1.X-p2.X);
        double y = double(p1.Y-p2.Y);
        return float(sqrt(x*x + y*y));
    }
    int main(int argc, char* argv[])
    {
        Point myp1(1,1),myp2(4,5);
        
        cout<<"The distance is:";
        cout<<fDist(myp1,myp2)<<endl;
        return 0;
    }

    运行结果:The distance is:5
    友元函数是在类中用关键字friend修饰的非成员函数。

    2、友元类

    声明友元类,是建立类与类之间的联系,实现类之间数据共享的一种途径。若A类为B类的友元类,则A类的所有成员都是B类的友元函数,都可以访问B类的私有和保护成员。
    第一、友元关系是不能传递的。B类是A类的友元,C类是B类的友元,C类和A类之间,如果没有声明,就没有任何友元关系,不能进行数据共享。
    第二、友元关系是单向的。如果声明B类是A类的友元函数,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有和保护数据。
    第三、友元关系是不被继承的。如果类B是A类的友元,类B的派生类并不会自动成为类A的友元。打个比方,就好像别人信任你,但不见得信任你的孩子。

    #include <iostream>
    using namespace std;
    
    class A
    {
        friend class B;
    public:
        void Display()
        {
            cout<<"I'm at A"<<endl;
            cout <<x<<endl;
        }
    private:
        int x;
    };
    
    class B
    {
    public:
        void Set(int i);
        void Display();
    private:
        A a;
    };
    
    void B::Set(int i)
    {
        a.x=i;
    }
    
    void B::Display()
    {
        cout <<"I'm at B"<<endl;
        a.Display();
    }
    
    int main(int argc, char* argv[])
    {
        B b;
        b.Set(99);
        b.Display();
        return 0;
    }

    运行结果:I‘ m B
           I'm A
                  99

  • 相关阅读:
    设置android:supportsRtl=&quot;true&quot;无效问题
    使用 Docker/LXC 迅速启动一个桌面系统
    快速部署Python应用:Nginx+uWSGI配置详解
    链表源代码(C语言实现)
    delete
    Linux与Unix shell编程指南(完整高清版).pdf
    数据挖掘python,java
    shops
    如何用Excel打开CSV文件
    svn迁移到git
  • 原文地址:https://www.cnblogs.com/haoyuanyuan/p/3088925.html
Copyright © 2020-2023  润新知