标签:style blog http color io os ar 数据 2014
类的组合与继承
(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"); }
执行结果
继承的综合运用《Point类派生出Circle类并且进行各种操作》
标签:style blog http color io os ar 数据 2014
原文地址:http://blog.csdn.net/u010105970/article/details/39336943