一、目标及代码:
/*
* 文件名称:Test.cpp
* 作 者:胡嘉威
* 完成日期:2017 年 5 月 22 日
* 版 本 号:v1.0
* 对任务及求解方法的描述部分:分别利用成员函数、友元函数和一般函数求两点间距离的函数,并设计main()函数完成测试
* 输入描述:无
* 问题描述:分别利用成员函数、友元函数和一般函数求两点间距离的函数,并设计main()函数完成测试
* 程序输出:
* 问题分析:主要要根据求解的步骤来定义不同的函数,然后不断调用函数进行运算
* 算法设计:先分析简化计算步骤,再将较复杂、有一定重复的步骤用函数定义,在用到这些步骤的时候就只要调用函数就可以了
*/
#include <iostream>
#include<cmath>
using namespace std;
class CPoint
{
private:
double x; // 定义横坐标
double y; // 定义纵坐标
public:
CPoint(double xx,double yy){x=xx;y=yy;}
double distance1(CPoint &c1); //display1是成员函数
friend double distance2(CPoint &c1,CPoint &c2); //display2是友元函数
double getX(){return x;}
double getY(){return y;}
};
double CPoint::distance1(CPoint &c1) //成员函数display1的实现,dispaly1前加CPoint::
{
double z;
z=sqrt((x-c1.x)*(x-c1.x)+(y-c1.y)*(y-c1.y));
cout<<"两点之间的距离为:"<<z<<endl; //以x形式直接访问私有数据成员,实质是this->x形式
return z;
}
double distance2(CPoint &c1,CPoint &c2) //友元函数dispaly2的实现,不加CPoint::,友元并不是类的成员
{
double z;
z=sqrt((c1.x-c2.x)*(c1.x-c2.x)+(c1.y-c2.y)*(c1.y-c2.y)); //虽然不是类的成员函数,却可以用d.x的形式直接访问私有数据成员——这就是友元
cout<<"两点之间的距离为:"<<z<<endl;
return z;
}
double distance3(CPoint &c1,CPoint &c2) //display3是一般函数,dispaly3前不加CPoint::
{
double z;
z=sqrt((c1.getX()-c2.getX())*(c1.getX()-c2.getX())+(c1.getY()-c2.getY())*(c1.getY()-c2.getY()));
cout<<"两点之间的距离为:"<<z<<endl;
//不能直接访问,只能用公共接口t.getHour()形式访问私有数据成员
return z;
}
int main()
{
CPoint c1(10,11),c2(9,12);
c1.distance1(c2); //成员函数这样调用:对象名.函数名()
distance2(c1,c2); //友员函数的调用和一般函数无异(但实现中可以不同)
distance3(c1,c2); //一般函数的调用
return 0;
}