关于友元函数没声明也能运行的问题

#include
using namespace std;
#include
class point{
private:
int x,y;
friend int dist1(point p1,point p2);

public:
point(int a=10,int b=10){ x=a; y=b; }
int getx( ){ return x; }
int gety( ){ return y; }
};
int dist1(point p1,point p2){
double x=(p2.x-p1.x);

double y=(p2.y-p1.y);
return sqrt(x*x+y*y);
}
int dist2(point p1,point p2){

double x=p2.getx()-p1.getx();
double y=p2.gety()-p1.gety();
return sqrt(x*x+y*y);
}
void main()
{
point p1(2,5),p2(4,20);

cout<<dist1(p1,p2)<<endl;

cout<<dist2(p1,p2)<<endl;

}

为什么dist2这个函数没有声明为友元函数,却也能正常运行?

x,y不是成员变量 x y,而是局部变量。两者不是一回事。

因为getx gety是公有函数,所以本来就能访问,不需要友元。

一楼的前辈,dist2中也有x,y啊?

如果你写
double x=(p2.x-p1.x);
那么肯定不能编译

dist2只需p1,p2对它公开,getx,gety是p1,p2的事。你可以反问一下,如果这样都不能访问类的私有成员变量,怎么才能访问?都定义友元来访问吗,那面向的封装特性还剩多少?