类的组合与继承
(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);
(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心;
(3)编写上述两类中的构造、析构函数及必要的输入输出函数
(4)定义友元函数int locate,判断点p在圆c上、圆c内或圆c外,返回值<0圆内,==0圆上,>0 圆外;
(5)重载关系运算符(6种)运算符,使之能够按圆的面积比较两个圆的大小;
程序代码
#include <iostream>
#include <cmath>
using namespace std;
class Point//点类
{
public:
//构造函数
Point(double a = 0, double b = 0);
//得到点的x坐标
double GetX();
//得到点的y坐标
double GetY();
//重载<<运算符实现输出点的坐标
friend ostream& operator<<(ostream &output, Point &p);
protected:
double x;
double y;
};
//构造函数
Point::Point(double a, double b):x(a), y(b){}
//得到点的x坐标
double Point::GetX()
{
return x;
}
//得到点的y坐标
double Point::GetY()
{
return y;
}
//重载<<运算符实现输出点的坐标
ostream& operator<<(ostream &output, Point &p)
{
output<<"("<<p.x<<","<<p.y<<")"<<endl;
return output;
}
//Point类派生出Circle类
class Circle : public Point
{
public:
//构造函数
Circle(double a = 0, double b = 0, double r = 0);
//得到圆的半径
double GetR();
//判断点p与圆c的位置
friend int locate(Point p, Circle c);
//计算圆的面积
double GetArea();
//输出圆的信息
friend ostream& operator<<(ostream &output, Circle &c);
//重载>运算符,用于比较两个圆的面积的大小
friend bool operator>(Circle &c1, Circle &c2);
//重载<运算符,用于比较两个圆的面积的大小
friend bool operator<(Circle &c1, Circle &c2);
//重载==运算符,用于比较两个圆的面积的大小
friend bool operator==(Circle &c1, Circle &c2);
//重载!=运算符,用于比较两个圆的面积的大小
friend bool operator!=(Circle &c1, Circle &c2);
//重载>=运算符,用于比较两个圆的面积的大小
friend bool operator>=(Circle &c1, Circle &c2);
//重载<=运算符,用于比较两个圆的面积的大小
friend bool operator<=(Circle &c1, Circle &c2);
protected:
double r;//半径
};
//构造函数
Circle::Circle(double a, double b, double r):
Point(a, b), r(r){}
//得到圆的半径
double Circle::GetR()
{
return r;
}
//得到圆的面积
double Circle::GetArea()
{
return 3.14 * r * r;
}
//判断点p与圆c的位置
int locate(Point p, Circle c)
{
double d;//保存点到圆心的距离
double r;//保存圆的半径
double flag;//标示位
//计算点到圆心的距离
d = sqrt((p.GetX() - c.GetX()) * (p.GetX() - c.GetX()) +
(p.GetY() - c.GetY()) * (p.GetY() - c.GetY()));
//得到圆的半径
r = c.GetR();
if(d > r )//点在圆外
{
flag = 1;
}
else if(d == r)//点在圆上
{
flag = 0;
}
else//点在圆内
{
flag = -1;
}
return flag;
}
//输出圆的信息
ostream& operator<<(ostream &output, Circle &c)
{
output<<"("<<c.GetX()<<","<<c.GetY()<<")"<<" r = "<<c.GetR()<<endl;
return output;
}
//重载>运算符,用于比较两个圆的面积的大小
bool operator>(Circle &c1, Circle &c2)
{
if(c1.GetArea() > c2.GetArea())
{
return true;
}
else
{
return false;
}
}
//重载<运算符,用于比较两个圆的面积的大小
bool operator<(Circle &c1, Circle &c2)
{
if(c1.GetArea() < c2.GetArea())
{
return true;
}
else
{
return false;
}
}
//重载==运算符,用于比较两个圆的面积的大小
bool operator==(Circle &c1, Circle &c2)
{
if(!(c1 > c2) && !(c1 < c2))
{
return true;
}
else
{
return false;
}
}
//重载!=运算符,用于比较两个圆的面积的大小
bool operator!=(Circle &c1, Circle &c2)
{
if( !(c1 == c2))
{
return true;
}
else
{
return false;
}
}
//重载>=运算符,用于比较两个圆的面积的大小
bool operator>=(Circle &c1, Circle &c2)
{
if( (c1 == c2) || (c1 > c2))
{
return true;
}
else
{
return false;
}
}
//重载<=运算符,用于比较两个圆的面积的大小
bool operator<=(Circle &c1, Circle &c2)
{
if( (c1 == c2) || (c1 < c2))
{
return true;
}
else
{
return false;
}
}
void main( )
{
Circle c1(3,2,4),c2(4,5,5); //c2应该大于c1
Point p1(1,1),p2(3,-2),p3(7,3); //分别位于c1内、上、外
cout<<"圆c1: "<<c1;
cout<<"点p1: "<<p1;
cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?"外":((locate(p1, c1)<0)?"内":"上"))<<endl;
cout<<"点p2: "<<p2;
cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl;
cout<<"点p3: "<<p3;
cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?"外":((locate(p3, c1)<0)?"内":"上"))<<endl;
cout<<endl;
cout<<"圆c1: "<<c1;
if(c1>c2) cout<<"大于"<<endl;
if(c1<c2) cout<<"小于"<<endl;
if(c1>=c2) cout<<"大于等于"<<endl;
if(c1<=c2) cout<<"小于等于"<<endl;
if(c1==c2) cout<<"等于"<<endl;
if(c1!=c2) cout<<"不等于"<<endl;
cout<<"圆c2: "<<c2;
cout<<endl;
system("pause");
}
执行结果