类的组合与继承

(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类而且进行各种操作》的更多相关文章

  1. C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等

    . 从people(人员)类派生出student(学生)类 添加属性:班号char classNO[]:从people类派生出teacher(教师)类, 添加属性:职务char principalsh ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. 实现如下类之间的继承关系,并编写Music类来测试这些类。

    实现如下类之间的继承关系,并编写Music类来测试这些类. package com.hanqi.test; public class Instrument { //输出弹奏乐器 public void ...

  4. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  5. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

    java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种 ...

  6. 使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form

    使用 PySide2 开发 Maya 插件系列二:继承 uic 转换出来的 py 文件中的类 Ui_Form 开发环境: Wing IDE 6.1 步骤1: 打开 Wing IDE,创建一个新的 pr ...

  7. php面向对象 封装继承多态 接口、重载、抽象类、最终类总结

    1.面向对象 封装继承多态  接口.重载.抽象类.最终类 面向对象 封装继承多态  首先,在解释面向对象之前先解释下什么是面向对象? [面向对象]1.什么是类? 具有相同属性(特征)和方法(行为)的一 ...

  8. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  9. C++ 继承 - 在派生类中对基类初始化

    构造函数与基类的其他成员不同,不能被派生类继承,因此为了初始化基类中的成员变量,需要在派生类中调用基类的构造函数(即显式调用),如果派送类没有调用则默认调用基类的无参构造函数(即隐式调用). 显式调用 ...

随机推荐

  1. [Javascript] 40个轻量级JavaScript脚本库

    诸如jQuery, MooTools, Prototype, Dojo和YUI等JavaScript脚本库,大家都已经很熟悉.但这些脚本库有利也有弊--比如说JavaScript文件过大的问题.有时你 ...

  2. computed与methods的异同

    在vue.js中,有methods和computed两种方式来动态当作方法来用的 如下: 两种方式在这种情况下的结果是一样的 写法上的区别是computed计算属性的方式在用属性时不用加(),而met ...

  3. 小程序:前端防止用户重复提交&即时消息(IM)重复发送问题解决

    背景: 最近参与开发的小程序,涉及到即时消息(IM)发送的功能: 聊天界面如下,通过键盘上的[发送]按钮,触发消息发送功能 问题发现: 功能开发完毕,进入测试流程:测试工程师反馈说: 在Android ...

  4. BZOJ 2288 贪心 +链表

    思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #incl ...

  5. pinpoint体系中,关于如何清理过期hbase数据

    版本: pinpoint:1.7.1 hbase:1.2.6 命令行命令: $HBASE_HOME/bin/hbase shell    newrestruct.hbase 备注:保留一天半的数据(秒 ...

  6. JavaScript全局函数

    JavaScript 中包含以下 7 个全局函数,用于完成一些常用的功能(以后的章节中可能会用到):escape( ).eval_r( ).isFinite( ).isNaN( ).parseFloa ...

  7. 利用JavaScript实现文本框改文字功能

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  8. SQL 字段类型详解

    bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off.    注意:很省空间的一种数据 ...

  9. 还是UVa340

    #include<stdio.h> #define maxn 1010 int main() { int num,a[maxn],i,j,b[maxn]; ; &&num) ...

  10. js中时间戳与日期时间之间的相互转换

    1.时间戳转换为标准日期时间格式: function timeFormat(dateStr) { var date = new Date(dateStr); Y = date.getFullYear( ...