类的组合与继承

(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. global cache cr request

    当一个进程访问需要一个或者多个块时,它会首先检查自己的CACHE是否存在该块,如果发现没有,就会先通过global cache赋予这些块 共享访问的权限,然后再访问.假如,通过global cache ...

  2. 【BZOJ1196】【HNOI2006】公路修建问题

    [描述] OI island是一个非常漂亮的岛屿,自开发以来,到这儿来旅游的人很多.然而,由于该岛屿刚刚开发不久,所以那里的交通情况还是很糟糕.所以,OIER Association组织成立了,旨在建 ...

  3. 【转】Java的可变类与不可变类

    1.可变类和不可变类(Mutable and Immutable Objects)的初步定义: 可变类:当你获得这个类的一个实例引用时,你可以改变这个实例的内容. 不可变类:当你获得这个类的一个实例引 ...

  4. Android网络编程随想录(四)

    前面三篇文章从最基础的TCP,HTTP协议理论开始,然后介绍了在Android的开发中所使用的HttpClient和HttpUrlConnection这两种Http客户端.在本文中,我们一起来学习一下 ...

  5. 第五课: - Stack / Unstack / Transpose函数

    第 5 课   我们将简要介绍 stack 和 unstack 以及 T (Transpose)函数. 在用pandas进行数据重排时,经常用到stack和unstack两个函数.stack的意思是堆 ...

  6. IAAS: IT公司去IOE-Alibaba系统构架解读

    从Hadoop到自主研发,技术解读阿里去IOE后的系统架构 原地址:...................... 云计算阿里飞天 摘要:从IOE时代,到Hadoop与飞天并行,再到飞天单集群5000节 ...

  7. C++文本操作.Vs.Python

    C++利用文件流: (1):读取一个字符 std::string TestTxt(argv[3]); // freopen(TestTxt.c_str(),"r",stdin);/ ...

  8. C#的split函数分割

    C#的split函数分割 string str = textBox1.Text; string[] strlist = str.Split("\r\n".ToCharArray() ...

  9. Selenium3+python自动化008-常用操作

    一.元素常用操作 1. clear()            清除文本 2. send_keys()        模拟输入 3. click()            单击元素 4.get_attr ...

  10. 文字纵向滚动marquee

    <div style="width:200px; height:300px"><marquee direction="up" truespee ...