尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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()实现多态通过基类指针管理不同几何图形添加移动、旋转、缩放等变换功能实现图形相交检测算法添加文件序列化功能保存和加载图形数据
RELATED

相关推荐

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

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

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

📅 2026/10/28 0:42:58
macOS把OBS画面变成系统级虚拟摄像头:obs-mac-virtualcam从安装到排障的完整指南

macOS把OBS画面变成系统级虚拟摄像头:obs-mac-virtualcam从安装到排障的完整指南

macOS把OBS画面变成系统级虚拟摄像头:obs-mac-virtualcam从安装到排障的完整指南 【免费下载链接】obs-mac-virtualcam ARCHIVED! This plugin is officially a part of OBS as of version 26.1. See note below for info on upgrading. 🎉🎉…

📅 2026/10/7 12:47:02
AI助手怎么选?ChatGPT、Claude、DeepSeek等6大模型全场景对比指南

AI助手怎么选?ChatGPT、Claude、DeepSeek等6大模型全场景对比指南

你是不是也遇到过这样的困惑:想用 AI 提升效率,但面对 ChatGPT、Claude、DeepSeek、Kimi 这些名字,根本不知道从何下手?免费版和付费版到底差在哪?哪个更适合写代码,哪个更适合读长文档,哪个又最…

📅 2026/10/8 12:45:12
MORE NEWS

更多资讯

📰

水稻病害识别:基于传统机器学习的轻量级落地方案

简介:本资源是一套基于Python机器学习技术实现的水稻病虫害自动识别系统源码,面向农业信息化开发者、计算机视觉初学者及智慧农业项目实践者,旨在解决田间图像采集后病虫害种类快速判别与模型部署的实际问题。压缩包共310个文件,含…

📰

超帧(Hyperframes)解决视频时间一致性问题的原理与实战

做视频处理这几年,我一度是个彻头彻尾的“逐帧主义者”——把每一帧当成独立的图片去修、去增强、去插帧。直到有一次接了个老胶片修复项目,单帧输出张张完美,一播放却像迪斯科灯球一样疯狂闪烁,客户直接发来一句“你是不是用了什…

📰

OpenShell复盘:让终端听懂人话,自动生成Shell命令

写这篇OpenShell复盘之前,我先说点实在的:如果你手里每天都在做重复性文件操作、日志分析、数据统计这类“含键盘量过高”的活儿,那么OpenShell这类工具就是给这些破事按下的暂停键。它不是一个能让你真正“躺着”写完程序的玩具,…

📰

PyTorch多变量时间序列预测:DeepAR、Informer、Transformer与RNN实战对比

简介:这份资源面向时间序列预测方向的研究者、算法工程师与高年级学生,聚焦用PyTorch复现并改进DeepAR、Informer、Transformer、RNN等经典模型,解决多变量时序分析与预测问题,覆盖金融、气象、工业等场景。压缩包共61个文件&…

📰

为 AI 配色提案保留像素账本

把图片交给 AI,请它总结“这是什么配色”,会得到很有气氛的词。可如果后续要生成主题变量,仍需要一个稳定的数值底座:到底哪些颜色出现了多少次?我会先从像素提取少量代表色,再让模型帮忙命名与讨论用途。 …

📰

三菱CNC数据采集C#源码Demo:EZSocket、缓冲落库与断线重连

简介:面向三菱CNC数采开发与自动化调试场景的C#示例工程,适合具备一定C#基础、希望将机床数据接入上位机或业务系统的工程师参考,也可作为自动化技术爱好者学习数控通讯流程的入门材料。内容围绕与三菱数控系统建立连接、采集加工参数与设备状…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬