源程序:
/*(文件注释头部开始)
*程序的版权和版本声明部分
*Copyright (c) 2011,烟台大学计算机学院学生
*All rights reserved.
*文件名称:平面坐标点类
*作 者:114-3张宗佳
*完成日期:2012年04月02号
*版本号:vc.3
* 对任务及求解方法的描述部分
* 输入描术:输入坐标点
* 问题描述:你需要完成的任务是,利用成员函数、友元函数和一般函数,实现三个版本的求两点间距离的函数,
* 并设计main()函数完成测试。此任务和上例的区别在于“距离是一个点和另外一个点的距离”,参数个数上有体现。
* 程序输出:输出两点之间距离、到原点距离、关于坐标轴和原点的对称点等
* 程序头部的注释结束
*/
#include<iostream>
#include<cmath>
using namespace std;
enum SymmetricStyle { axisx,axisy,point};//分别表示按x轴, y轴, 原点对称
class CPoint
{
private:
double x; // 横坐标
double y; // 纵坐标
public:
CPoint(double xx = 0,double yy = 0);
double Distance1(CPoint p) ; // 两点之间的距离(一点是当前点,另一点为参数p)
friend double Distance2(CPoint &);
double getx(){return x;}
double gety(){return y;}
void input();
};
double Distance3(CPoint &);
CPoint::CPoint(double xx,double yy):x(xx),y(yy){}
// 两点之间的距离(一点是当前点,另一点为参数p)
// 成员函数的实现,Distance前加Cpoint::,以x,y的形式直接访问私有数据成员
double CPoint::Distance1(CPoint p)
{
return(sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y)));
}
//友元函数的实现,
double Distance2(CPoint &p)
{
CPoint p1;
cout << "请输入一个点" ;
p1.input();
return(sqrt((p1.x - p.x) * (p1.x - p.x) + (p1.y - p.y) * (p1.y - p.y)));
}
//普通函数的实现
double Distance3(CPoint &p)
{
CPoint p1;
cout << "请输入一个点" ;
p1.input();
return(sqrt((p1.getx() - p.getx()) * (p1.getx() - p.getx()) + (p1.gety() - p.gety()) * (p1.gety() - p.gety())));
}
//以x,y 形式输入坐标点
void CPoint::input()
{
char c;
cout << "格式:(x,y):" ;
cin >> x >> c >> y;
while(1)
{
if(c != ',')
{
cout << "格式出错请重输!" << endl;
}
else break;
}
return ;
}
void main()
{
CPoint p1,p2;
cout << "输入第一个点p1:" ;
p1.input();
cout << "输入第二个点p2:";
p2.input();
cout << "这两点之间的距离是:" << p1.Distance1(p2) << endl;//调用成员函数
cout << "这两点之间的距离是:" << Distance2(p1) << endl;//友元函数的调用
cout << "这两点之间的距离是:" << Distance3(p1) << endl;//普通函数的调用
system("pause");
}
实验结果:
经验积累:
1.友元函数,一关键字friend声明,一个类的友元函数可以访问这个类中的私有成员,就像其实贺老可以去我家吃面.....
2.需要注意的是,友元函数并不属于类的成员函数,在访问类内的数据成员时,必须制定一个要访问的对象,通过制定的对象来访问私有数据成员
3.而普通函数只能通过调用类的成员函数来访问类的私有成员
上机感言:
好友元,好朋友~