C++ 面向对象编程:圆类设计及运算符重载
C++ 面向对象编程:圆类设计及运算符重载
本示例展示了如何使用 C++ 面向对象编程,设计一个圆类(Circle),并继承点类(Point)和平面图形基类(Plane)。同时,对 << 和 >> 运算符进行了重载,以方便 Point 和 Circle 对象的输入输出操作。
代码示例
#include <iostream>
#include <fstream>
using namespace std;
// 点类 Point
class Point
{
private:
double x;
double y;
public:
Point(double xv=0,double yv=0);/*构造函数*/
void setX(double xv); /*设置X坐标*/
void setY(double yv); /*设置Y坐标*/
double getX() const; /*获取X坐标*/
double getY() const; /*获取Y坐标*/
friend ostream & operator << (ostream &out, const Point &p); //运算符<<重载
friend istream & operator >> (istream &in, Point &p); //运算符>>重载
};
class Plane /*平面图形基类*/
{
public:
virtual double length()const=0;/*周长*/
virtual double area()const=0; /*面积*/
};
// 圆类 Circle
class Circle:public Point,public Plane
{
private:
double radius;
protected:
static const double PI;
public:
Circle(double xv=0,double yv=0,double r=0);/*构造函数*/
void setR(double r); /*设置半径*/
double getR() const; /*获取半径*/
double area()const; /*面积*/
double length()const; /*周长*/
friend ostream & operator << (ostream &out, const Circle &c); //运算符<<重载
friend istream & operator >> (istream &in, Circle &c); //运算符>>重载
};
/*请在这里填写第一部分答案*/
void f(Plane const &p)
{
cout<<p.area()<<endl;
cout<<p.length()<<endl;
}
//主函数
int main(void)
{
double d1,d2;
cin>>d1>>d2;
Point p(d1,d2);
Circle c;
/*请在这里填写第二部分答案*/
f(c);
return 0;
}
### 输入样例:
1.0 2.1
### 输出样例:
30.1907
19.4779
### 参考答案:
#### 第一部分:Point 类和 Circle 类的实现
##### Point 类实现
```c++
// Point 类构造函数
Point::Point(double xv, double yv)
{
x = xv;
y = yv;
}
// Point 类 setX() 和 setY() 函数
void Point::setX(double xv)
{
x = xv;
}
void Point::setY(double yv)
{
y = yv;
}
// Point 类 getX() 和 getY() 函数
double Point::getX() const
{
return x;
}
double Point::getY() const
{
return y;
}
// Point 类 << 运算符重载
ostream & operator << (ostream &out, const Point &p)
{
out << '(' << p.x << ',' << p.y << ')';
return out;
}
// Point 类 >> 运算符重载
istream & operator >> (istream &in, Point &p)
{
char c;
in >> c >> p.x >> c >> p.y >> c;
return in;
}
Circle 类实现
// Circle 类静态常量 PI
const double Circle::PI = 3.1415926;
// Circle 类构造函数
Circle::Circle(double xv, double yv, double r):Point(xv,yv)
{
radius = r;
}
// Circle 类 setR() 函数
void Circle::setR(double r)
{
radius = r;
}
// Circle 类 getR() 函数
double Circle::getR() const
{
return radius;
}
// Circle 类 area() 函数
double Circle::area() const
{
return PI * radius * radius;
}
// Circle 类 length() 函数
double Circle::length() const
{
return 2 * PI * radius;
}
// Circle 类 << 运算符重载
ostream & operator << (ostream &out, const Circle &c)
{
out << "圆心坐标:" << static_cast<const Point &>(c) << " 半径:" << c.radius << " 面积:" << c.area() << " 周长:" << c.length();
return out;
}
// Circle 类 >> 运算符重载
istream & operator >> (istream &in, Circle &c)
{
in >> static_cast<Point &>(c) >> c.radius;
return in;
}
第二部分:main() 函数实现
int main(void)
{
double d1,d2;
cin>>d1>>d2;
Point p(d1,d2);
Circle c;
cin>>c;
cout<<p<<endl; //输出点对象
cout<<c<<endl; //输出圆对象
f(c);
return 0;
}
注意事项
- 在 main() 函数中,先输入点的坐标,再输入圆的半径和圆心坐标,可以通过输入流重载实现。
- 输出点和圆对象可以通过重载输出流运算符实现。
- 调用 f() 函数时,使用基类指针指向派生类对象,可以体现多态性。
本示例展示了如何使用 C++ 面向对象编程的基本概念,包括类、继承、多态、运算符重载等,并通过一个圆类的设计示例,演示了如何将这些概念应用于实际编程问题。 ``
原文地址: https://www.cveoy.top/t/topic/okCb 著作权归作者所有。请勿转载和采集!