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
原文链接: https://www.cnblogs.com/haoyuanyuan/archive/2013/05/20/3088925.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/89214

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午12:01
下一篇 2023年2月10日 上午12:02

相关推荐