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;
}

代码解释

  1. 类定义

    • Point 类表示一个点,包含 xy 坐标。
    • Plane 类是一个抽象基类,用于表示平面图形,它定义了 lengtharea 的虚函数。
    • Circle 类继承自 PointPlane,表示一个圆,包含半径 radius
  2. 成员函数

    • 构造函数用于初始化对象。
    • setXsetYgetXgetY 用于设置和获取点的坐标。
    • setRgetR 用于设置和获取圆的半径。
    • arealength 分别计算圆的面积和周长。
  3. 运算符重载

    • operator<< 重载用于将点和圆对象输出到流。
    • operator>> 重载用于从流中读取点和圆对象。
  4. 主函数

    • 从标准输入流中读取点的坐标。
    • 从标准输入流中读取圆的信息(中心点坐标和半径)。
    • 使用 f 函数输出圆的面积和周长。

学习要点

  • 面向对象编程的基本概念,如类、对象、继承、多态、虚函数等。
  • 运算符重载的使用方法。
  • 如何使用 friend 函数实现对私有成员的访问。
  • 文件读写操作。

本示例为学习 C++ 面向对象编程提供了一个很好的基础,可以帮助你更好地理解和掌握相关的知识。

C++ 面向对象程序设计:圆类设计与运算符重载

原文地址: https://www.cveoy.top/t/topic/okCe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录