发布时间:2026/8/21 9:44:04
C++面向对象编程:Point、Line、Rectangle、Circle类设计与实现 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: // 重载setA1.双参数赋值 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()实现多态通过基类指针管理不同几何图形添加移动、旋转、缩放等变换功能实现图形相交检测算法添加文件序列化功能保存和加载图形数据

相关新闻

2026/8/21 9:44:04

大模型 API 的范式转移:从 Chat Completions 到 Responses API

引言 2025 年 3 月,OpenAI 正式推出 Responses API。一年后的今天,它已成为构建 AI Agent 的首选接口。2026 年 3 月,OpenAI 进一步扩展了 Responses API,加入 Shell 工具和托管容器工作空间。与此同时,Assistants API…

2026/8/21 9:39:02

C++数据结构第一章:指针、内存与类封装的底层实践

1. 这不是“抄答案”,而是用C重走数据结构与算法的奠基之路如果你正盯着《C数据结构与算法》王立柱老师教材第一章的课后题发愁,手边堆着VSCode、Visual Studio或者Dev-C,心里盘算着“只要把答案复制粘贴过去交差就行”——那我得先打断你一下…

2026/8/21 9:39:02

基于SpringBoot的二手车交易平台源码+文档

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/21 11:00:25

服务器安全评估与加固:从黑盒探查到可信环境构建

在实际的服务器运维和开发工作中,我们经常会遇到一些来源不明、功能模糊的“神秘服务器”。它们可能来自第三方服务商、开源社区的自建镜像,或是内部遗留的、文档缺失的系统。这些服务器往往打着“高性能”、“一键部署”、“内置黑科技”的旗号进行宣传…

2026/8/21 11:00:25

C++完美转发:std::forward原理、应用与陷阱详解

1. 项目概述:为什么我们需要“完美转发”?在C的模板编程和泛型设计里,有一个问题困扰了无数开发者:当你写一个泛型函数,它接收参数后需要原封不动地传递给另一个函数时,参数的“值类别”和“常量性”会丢失…

2026/8/21 11:00:25

Qt C++表格开发进阶:QItemSelectionModel与QStyledItemDelegate详解

这次我们来看一个 Qt C 开发中的核心进阶话题:如何高效地管理表格或列表中的项目选择,并自定义其外观与交互。 QItemSelectionModel 和 QStyledItemDelegate 是 Qt Model/View 框架中两个功能强大但常被初学者忽视的类。它们一个负责处理复杂的多选、…

2026/8/21 11:00:25

Obsidian插件LyricFlux 1.4.1:一体化音乐管理与知识库集成指南

这次我们来看一个 Obsidian 插件:LyricFlux。它不是一个简单的音乐播放器,而是一个集成了多平台音乐下载、试听、标签编辑、库外路径引用和一站式播放管理的强大工具。对于深度使用 Obsidian 作为知识管理或笔记创作中心的用户来说,这意味着你…

2026/8/20 10:17:13

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/20 20:11:18

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 0:03:13

Linux命令-uucico(UUCP传输程序)

Linux命令-uucico(UUCP传输程序) 🔰简介UUCP 体系简介 📖语法⚙️选项配置文件 💡示例示例 1:基本传输操作示例 2:主模式与从模式示例 3:调试与故障排查示例 4:UUCP 配置…

2026/8/21 0:03:13

Linux命令-uupick(UUCP文件接收工具)

Linux命令-uupick(UUCP文件接收工具)🔰简介uupick 在 UUCP 传输链中的位置📖语法⚙️选项交互命令💡示例示例 1:基本接收操作示例 2:仅处理来自特定系统的文件示例 3:完整 UUCP 文件…

2026/8/20 8:35:23

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/20 9:15:29

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/21 0:31:27

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…