C++ 面向对象程序设计:圆类设计与运算符重载
C++ 圆类设计与运算符重载
本示例演示了如何使用 C++ 面向对象编程设计圆类,并实现点类和圆类的输入输出运算符重载。
代码示例
#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::Point(double xv, double yv) : x(xv), y(yv) {}
void Point::setX(double xv) { x = xv; }
void Point::setY(double yv) { y = yv; }
double Point::getX() const { return x; }
double Point::getY() const { return y; }
ostream & operator << (ostream &out, const Point &p) { out << '(' << p.x << ',' << p.y << ')'; return out; }
istream & operator >> (istream &in, Point &p) { in >> p.x >> p.y; return in; }
const double Circle::PI = 3.1415926535897932384626;
Circle::Circle(double xv, double yv, double r) : Point(xv, yv), radius(r) {}
void Circle::setR(double r) { radius = r; }
double Circle::getR() const { return radius; }
double Circle::area() const { return PI * radius * radius; }
double Circle::length() const { return 2 * PI * radius; }
ostream & operator << (ostream &out, const Circle &c) { out << 'O' << (Point)c << ',r=' << c.radius; return out; }
istream & operator >> (istream &in, Circle &c) { in >> (Point &)c >> c.radius; return in; }
// 主函数
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;
}
代码解释
-
类定义
Point类表示一个点,包含x和y坐标。Plane类是一个抽象基类,用于表示平面图形,它定义了length和area的虚函数。Circle类继承自Point和Plane,表示一个圆,包含半径radius。
-
成员函数
- 构造函数用于初始化对象。
setX、setY、getX、getY用于设置和获取点的坐标。setR和getR用于设置和获取圆的半径。area和length分别计算圆的面积和周长。
-
运算符重载
operator<<重载用于将点和圆对象输出到流。operator>>重载用于从流中读取点和圆对象。
-
主函数
- 从标准输入流中读取点的坐标。
- 从标准输入流中读取圆的信息(中心点坐标和半径)。
- 使用
f函数输出圆的面积和周长。
学习要点
- 面向对象编程的基本概念,如类、对象、继承、多态、虚函数等。
- 运算符重载的使用方法。
- 如何使用
friend函数实现对私有成员的访问。 - 文件读写操作。
本示例为学习 C++ 面向对象编程提供了一个很好的基础,可以帮助你更好地理解和掌握相关的知识。
原文地址: https://www.cveoy.top/t/topic/okCe 著作权归作者所有。请勿转载和采集!