Byte

友元关系

N 人看过

友元关系

C++友元关系主要分为三类

1.全局函数作友元

​ 默认情况下,类的 private 成员只能在类的内部来访问,在类的外部访问 private 成员是非法的。而如果想在类外部的全局函数里访问 private 成员的话,就可以定义该函数与类的友元关系来访问类的 private 成员。

​ 形象来说,类相当于一栋房子。public 成员储存在客厅,外来的客人可以任意访问;而 private 成员储存在卧室,外人莫入,只能自己访问。而如果想让某个朋友也能进入卧室访问 private 成员的话,那么就可以专门给他开一个小门,允许他进入卧室。这个小门就可以称为友元关系。

class Point1{
    private:
        int sitex,sitey;
    public:
        Point1(int x,int y)
        {
            sitex = x,sitey = y;
        }
        friend void distance(const Point1 *,const Point1 *);//全局函数作友元
};// 定义 Point 类

void distance(const Point1 *a,const Point1 *b)
{
    int dx = a->sitex - b->sitex,dy = a->sitey; - b->sitey;
    std::cout << dx << " " << dy << std::endl;
}// 友元关系使得该函数能访问 private 成员 sitex 和 sitey
#include<iostream>
#include<windows.h>
class Point2;
class Point1{
    friend class Point1Friend;//类的友元,使得22行
    private:
        int sitex,sitey;
    public:
        Point1(int x,int y)
        {
            sitex = x,sitey = y;
        }
        friend void distance(const Point1 *,const Point1 *);//全局函数作友元
        //void distanceNoFriend(const Point1 *,const Point1 *);
};
class Point1Friend{
    public:
        Point1Friend(Point1 *a)
        {
            P1s = a;
        }
        void getPoint1()
        {
            std::cout << "contents from Point1Friend: " << P1s->sitex << ' ' << P1s->sitey << std::endl;
        }
    private:
        Point1 *P1s;
};
class Point2Friend{
    public:
        void getPoint2(const Point2 *);
    private:
};
class Point2{
    friend void Point2Friend::getPoint2(const Point2 *);//友元成员函数,先写friend的类,再写本身,因为关系是Point2Friend->Point2
    public:
        Point2(int x,int y,int z)
        {
            sitex = x,sitey = y,sitez = z;
        }
        void get2()
        {
            std::cout << sitex << " " << sitey << ' ' << sitez << ' ' <<std::endl;
        }
    private:
        int sitex,sitey,sitez;
};
void distance(const Point1 *a,const Point1 *b)
{
    int dx = a->sitex - b->sitex,dy = a->sitey; - b->sitey;
    std::cout << dx << " " << dy << std::endl;
}
//有friend
// void distanceNoFriend(const Point1 *a,const Point1 *b)
// {
//     int dx = a->sitex - b->sitex,dy = a->sitey; - b->sitey;
//     std::cout << dx << " " << dy << std::endl;
// }
//没friend
void Point2Friend::getPoint2(const Point2 *a)
{
    std::cout << "contents from Point2Friend: " << a->sitex << ' ' << a->sitey << ' ' << a->sitez << std::endl;
}
int main()
{
    Point1 *P1a = new Point1(1,2);
    Point1 *P1b = new Point1(0,0);
    Point2 *P2 = new Point2(3,4,5);
    Point1Friend *F1 = new Point1Friend(P1a);
    Point2Friend *F2 = new Point2Friend();
    F1->getPoint1();
    F2->getPoint2(P2);
    distance(P1a,P1b);
    delete P1a,P1b,P2,F1,F2;
    system("pause");
    return 0;
}

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 (CC BY-NC-ND 4.0) 进行许可。