友元关系
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) 进行许可。