C++面向对象编程:Point、Line、Rectangle、Circle类设计与实现
2026/8/21 9:43:42 网站建设 项目流程

1. 引言

在C++面向对象编程中,类的设计是核心基础。本文将通过一个完整的示例,展示如何设计Point(点)Line(线段)Rectangle(长方形)Circle(圆)四个类,并实现它们的基本功能。这些类之间存在组合关系,体现了面向对象编程的封装、组合和代码复用思想。

2. Point类设计

Point类表示二维平面上的一个点,包含x和y坐标。这是所有其他几何图形的基础。

// 坐标点类 class Pointer { private: double xpos; // x坐标 double ypos; // y坐标 public: // 带默认形参0的设置函数 void setX(double x = 0) { xpos = x; } void setY(double y = 0) { ypos = y; } // const只读成员函数,获取坐标 double getX() const { return xpos; } double getY() const { return ypos; } };

设计要点:

  • 使用private封装坐标数据,确保数据安全
  • 设置函数带默认参数,方便使用
  • 获取函数声明为const,保证不修改对象状态

3. Line类设计

Line类表示一条线段,由两个Point对象组成(组合关系)。

// 线段类:包含两个Point成员(组合:Line由两个Point组成) class Line { private: Pointer a; // 起点 Pointer b; // 终点 public: // 重载setA:1.双参数赋值 2.对象引用赋值 void setA(double x, double y) { a.setX(x), a.setY(y); } void setA(const Pointer& at) { a = at; } // 重载setB:两种传参方式 void setB(double x, double y) { b.setX(x), b.setY(y); } void setB(const Pointer& bt) { b = bt; } // 函数重载:普通版(返回值拷贝)、const常函数版(返回常引用) Pointer getA() { return a; } // 一般版本 const Pointer& getA() const { return a; } // 优化版本 Pointer getB() { return b; } const Pointer& getB() const { return b; } // const函数:计算两点间线段长度(勾股定理) double length() const { double dx = a.getX() - b.getX(); double dy = a.getY() - b.getY(); return sqrt(dx * dx + dy * dy); } };

设计要点:

  • 使用组合关系:Line包含两个Point对象
  • 函数重载:提供多种参数类型的设置函数
  • const成员函数:length()不修改对象状态
  • 返回常引用:避免不必要的对象拷贝

4. Rectangle类设计

Rectangle类表示长方形,由左下角和右上角两个Point构成。

// 长方形类(左下角+右上角两个Point构成矩形) class 长方形 { private: Pointer leftDown; // 左下角坐标点 Pointer rightUp; // 右上角坐标点 public: // 设置矩形两个顶点 void setData(double x1, double y1, double x2, double y2) { leftDown.setX(x1); leftDown.setY(y1); rightUp.setX(x2); rightUp.setY(y2); } // 获取长、宽 double getW() const { return fabs(rightUp.getX() - leftDown.getX()); } double getH() const { return fabs(rightUp.getY() - leftDown.getY()); } // 面积 double getArea() const { return getW() * getH(); } // 周长 double getPerimeter() const { return 2 * (getW() + getH()); } };

5. Circle类设计

Circle类表示圆形,由圆心Point和半径组成。

// 圆形类(圆心Point+半径) class 圆 { private: Pointer center; // 圆心坐标 double r; // 半径 public: // 设置圆心和半径 void setData(double cx, double cy, double rad) { center.setX(cx); center.setY(cy); r = rad; } // 面积 πr² double getArea() const { const double PI = 3.1415926; return PI * r * r; } // 周长 2πr double getPerimeter() const { const double PI = 3.1415926; return 2 * PI * r; } };

6. 主函数测试

下面是完整的测试代码,展示如何使用这些类:

#include <iostream> #include <cmath> using namespace std; // 包含上述所有类的定义... int main() { // 1.测试长方形:左下(1,1) 右上(4,5) → 宽3 高4 长方形 rect; rect.setData(1, 1, 4, 5); cout << "长方形宽:" << rect.getW() << " 高:" << rect.getH() << endl; cout << "长方形面积:" << rect.getArea() << " 周长:" << rect.getPerimeter() << endl; // 2.测试圆形:圆心(2,2) 半径3 圆 circle; circle.setData(2, 2, 3); cout << "圆形面积:" << circle.getArea() << " 周长:" << circle.getPerimeter() << endl; // 3.测试Point和Line Pointer p1; p1.setX(1.2); p1.setY(3.4); cout << "点坐标:(" << p1.getX() << ", " << p1.getY() << ")" << endl; Line line; line.setA(0, 0); line.setB(3, 4); cout << "线段长度:" << line.length() << endl; // 结果5 return 0; }

7. 面向对象设计原则总结

1. 封装性:所有数据成员都声明为private,通过公有成员函数访问。

2. 组合关系:Line、Rectangle、Circle都包含Point对象,体现了"has-a"关系。

3. 代码复用:基于Point类构建更复杂的几何图形,避免重复代码。

4. 接口设计:提供清晰的公有接口,隐藏实现细节。

5. const正确性:不修改对象状态的函数都声明为const

8. 扩展思考

可以进一步扩展这个设计:

  • 添加Shape基类,定义统一的接口(如getArea()getPerimeter()
  • 实现多态,通过基类指针管理不同几何图形
  • 添加移动、旋转、缩放等变换功能
  • 实现图形相交检测算法
  • 添加文件序列化功能,保存和加载图形数据

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询