问题:C++友元函数的最简单案例

本程序通过VC++ 6.0编译与测试,程序的目的是求两个点之间的中点坐标,具体代码如下:

//没有使用友元类,报错,错误分析见代码注释
#include <iostream>
using namespace std;
class Point
{
public:
	Point(float a,float b):x(a),y(b){}
	void print()
	{
		cout<<"("<<x<<","<<y<<")"<<endl;
	}
private:
	float x;
	float y;
};

//写一个函数求两个点的中点
Point middle(const Point &p1,const Point &p2)
{
	
	Point middleP((p1.x+p2.x)/2,(p1.y+p2.y)/2); 
	//错误处,由于x,y为私有变量,显然不可以通过p1.x的方式获取
	//程序显然会报错
	//这里可以采用get的方式来获取,当然会麻烦一点
	//简单一点的方法就是使用友元函数
	return middleP;
}

int main()
{
	Point p(0,0);
	Point q(1,1);
	middle(p,q).print();
	return 0;
}

未使用友元函数时程序编译出错,具体提示如图:

//使用友元函数后,程序可以正确输出运行结果
#include <iostream>
using namespace std;
class Point
{
public:
    friend Point middle(const Point &p1,const Point &p2);//声明友元函数
    Point(float a,float b):x(a),y(b){}
    void print()
    {
        cout<<"("<<x<<","<<y<<")"<<endl;
    }
private:
    float x;
    float y;
};

//写一个函数求两个点的中点
Point middle(const Point &p1,const Point &p2)
{
    
    Point middleP((p1.x+p2.x)/2,(p1.y+p2.y)/2);//使用友元函数后可以获取private变量
    return middleP;
}

int main()
{
    Point p(0,0);
    Point q(1,1);
    middle(p,q).print();
    return 0;
}

程序运行结果如下: