C++面向对象编程:Point、Line、Rectangle、Circle类设计与实现

发布时间:2026/10/8 5:24:11

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/10/5 18:22:35

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

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

2026/10/5 18:22:39

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

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

2026/10/5 18:46:03

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

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

2026/10/8 5:23:04

从Prompt到Superpower Skills:AI智能体技能包开发实战

最近一个月,“skills” 这个词在我关注的 AI 圈子里几乎刷屏了。GitHub 上各种 agent skills 仓库层出不穷,Claude 和 Codex 也开始把技能能力提升到与工具同等重要的位置。跟很多朋友聊天,大家已经从“怎么问大模型”切换到了“怎么给大模型…

2026/10/8 5:23:04

一文读懂HyperFrame:分布式SQL查询引擎的加速内核

如果你最近在翻Apache Arrow生态的源码,或者看DataFusion、Ballista的设计文档,大概率会撞上一个叫hyperframe的词。我第一次看到它的时候挺懵的:DataFrame我熟,RecordBatch我也熟,hyperframe夹在中间到底是个什么东西…

2026/10/8 5:23:04

AI智能体技能(Skills)设计与GKE+Gemini实战指南

1. 项目概述:当“skills”不再是个模糊标签,而是一套可定义、可编排、可验证的智能体能力单元你有没有在调试一个自动化流程时,突然卡在某个环节——不是代码报错,而是逻辑断层?比如让AI帮写一封客户邮件,它…

2026/10/8 5:23:04

大模型上下文模式设计:从窗口压缩到动态路由的工程实践

一提起“context-mode”,早期用过各类对话式AI应用的朋友应该都有印象——当初各家产品界面里那个能切换“简洁回复”“详细模式”“自定义指令”的开关,本质上就是在调整上下文的管理方式。但我今天不聊产品界面上的那个开关,我想聊的是把它…

2026/10/8 5:23:04

Superpowers 技能增强方案:从零搭建高效开发工作流

1. 从“superpowers”这个标题说起:它到底指什么第一次看到“superpowers”这个词,很多人脑子里蹦出来的可能是超级英雄、超能力这类画面。但如果你是在技术社区、开发者群或者效率工具圈里看到它,那大概率说的不是漫画,而是一个在…

2026/10/8 5:18:04

Context-Mode设计实战:AI应用上下文管理的核心路径

提到context-mode,很多人的第一反应可能都不一样:搞 Android 的会想到 Context 对象,做操作系统的会想到进程上下文,做前端的甚至会以为是什么框架里的新名词。但在 AI 应用和智能体开发领域,context-mode 其实指向一个…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑