云主机做网站永久保留网站网站网页

张小明 2025/12/28 23:54:39
云主机做网站永久保留网站,网站网页,wordpress调起淘宝app,专业网站推广软件C 类与对象实战#xff1a;手把手教你实现一个实用的日期类 引言 在C编程中#xff0c;类与对象 是面向对象编程的核心概念。今天#xff0c;我们将通过实现一个功能完整的日期类#xff0c;来深入理解C中类的设计、封装、运算符重载等关键知识点。这个日期类不仅是一个优秀…C 类与对象实战手把手教你实现一个实用的日期类引言在C编程中类与对象是面向对象编程的核心概念。今天我们将通过实现一个功能完整的日期类来深入理解C中类的设计、封装、运算符重载等关键知识点。这个日期类不仅是一个优秀的教学示例也包含了实际开发中的许多最佳实践。一、类的封装数据与行为的结合1.1 成员变量的封装class Date { private: int _year; // 年份 int _month; // 月份 int _day; // 日期 public: // 公有接口 };为什么要将成员变量设为私有数据隐藏外部不能直接修改数据只能通过公有接口数据验证可以在setter方法中验证数据的合法性接口稳定内部实现改变不影响外部调用1.2 构造函数与初始化Date::Date(int year 1900, int month 1, int day 1) { _year year; _month month; _day day; if (!CheckDate()) // 构造函数中进行数据验证 { cout 日期非法 endl; } }构造函数的特点与类同名无返回值可以有默认参数在对象创建时自动调用二、类的核心功能实现2.1 获取月份天数int GetMonthDay(int year, int month) { assert(month 0 month 13); static int monthDayArray[13] { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 处理闰年二月 if (month 2 ((year % 4 0 year % 100 ! 0) || (year % 400 0))) { return 29; } else { return monthDayArray[month]; } }代码亮点使用static数组避免重复初始化正确处理闰年规则使用assert进行参数检查2.2 日期合法性检查bool Date::CheckDate() { if (_month 1 || _month 12 || _day 1 || _day GetMonthDay(_year, _month)) { return false; } return true; }三、运算符重载的艺术3.1 比较运算符重载bool Date::operator(const Date d) const { if (_year d._year) return true; else if (_year d._year) { if (_month d._month) return true; else if (_month d._month) { return _day d._day; } } return false; }比较运算符的重载技巧// 基于 和 实现其他比较运算符 bool operator(const Date d) const { return *this d || *this d; } bool operator(const Date d) const { return !(*this d); } bool operator(const Date d) const { return !(*this d); } bool operator!(const Date d) const { return !(*this d); }3.2 日期加减运算的重载关键设计理念先实现复合赋值运算符、-再基于它们实现算术运算符、-。// 1. 先实现 Date Date::operator(int day) { if (day 0) return *this - -day; _day day; while (_day GetMonthDay(_year, _month)) { _day - GetMonthDay(_year, _month); _month; if (_month 13) { _year; _month 1; } } return *this; // 返回引用支持链式调用 } // 2. 基于 实现 Date Date::operator(int day) const { Date tmp *this; // 拷贝当前对象 tmp day; // 复用 的实现 return tmp; // 返回新对象 }为什么要这样设计代码复用避免重复实现日期进位逻辑易于维护修改逻辑只需改一处效率优化直接修改对象效率高于通过实现3.3 前置与后置自增的重载// 前置先自增后返回 Date Date::operator() { *this 1; return *this; // 返回自身引用 } // 后置先保存原值再自增返回原值 Date Date::operator(int) // int参数仅用于区分 { Date tmp(*this); // 保存原值 *this 1; // 自身自增 return tmp; // 返回原值副本 }区别总结前置返回引用效率高后置返回对象副本效率较低参数int仅用于编译器区分不实际使用3.4 日期差值的计算int Date::operator-(const Date d) const { Date max *this; Date min d; int flag 1; if (*this d) // 比较日期大小 { max d; min *this; flag -1; } int n 0; while (min ! max) // 逐天计数 { min; n; } return n * flag; // 返回带符号的天数差 }四、流运算符重载4.1 为什么流运算符必须是友元// 错误示例作为成员函数 void Date::operator(ostream out) // 第一个参数是this { out _year - _month - _day; } // 使用d1 cout; // 不符合习惯 // 正确示例友元函数 friend ostream operator(ostream out, const Date d) { out d._year 年 d._month 月 d._day 日; return out; } // 使用cout d1; // 自然直观流运算符的特点必须是全局函数或友元函数第一个参数是流对象第二个参数是目标对象返回流引用以支持链式输出五、const成员函数class Date { public: // const成员函数承诺不修改对象 void Print() const; bool operator(const Date d) const; Date operator(int day) const; // 非const成员函数可能会修改对象 Date operator(int day); Date operator(); };const成员函数的重要性允许const对象调用明确函数的意图提高代码安全性六、完整使用示例int main() { // 1. 创建对象 Date d1(2024, 4, 14); Date d2(2024, 12, 31); // 2. 日期运算 cout d1: d1 endl; Date d3 d1 100; // 100天后 cout 100天后: d3 endl; d1 30; // d1增加30天 cout d1增加30天: d1 endl; // 3. 日期比较 if (d1 d2) cout d1在d2之前 endl; // 4. 日期差 int days d2 - d1; cout 相差天数: days endl; // 5. 自增运算 Date d4 d1; cout d1后置: d1 endl; cout d4(原值): d4 endl; Date d5 d1; cout d1前置: d1 endl; cout d5(新值): d5 endl; return 0; }七、类的设计思考7.1 接口设计原则自然直观运算符重载应符合直觉功能完整提供常用的日期操作错误处理在构造函数中验证日期合法性效率考虑合理使用引用和const7.2 代码复用策略先实现修改自身的运算符、、-基于它们实现产生新对象的运算符、-比较运算符相互依赖减少重复代码7.3 性能优化返回引用避免不必要的拷贝使用inline函数减少函数调用开销合理使用const提高编译器优化机会八、扩展思考这个日期类还可以进一步扩展添加更多功能 计算星期几 计算两个日期之间的工作日 计算节气和节日性能优化 使用更高效的日期差算法 实现移动语义支持 添加缓存机制国际化支持 支持不同历法 多语言输出 时区处理结语通过实现这个日期类我们深入理解了C类与对象的核心概念封装将数据和操作封装在一起运算符重载让自定义类型拥有内置类型的便利性const正确性提高代码的安全性和可读性友元函数在需要时突破封装限制代码复用通过合理的依赖关系减少重复代码这个日期类不仅是一个实用的工具更是一个优秀的学习示例。希望通过对它的分析能帮助你更好地理解C面向对象编程的精髓。记住好的类设计应该让使用变得简单让维护变得容易让扩展变得可能。这就是面向对象编程的魅力所在。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

厦门做网站多少网站编辑做的准备

树莓派在机器人与角色扮演中的应用探索 树莓派与ROS环境下的NXT智能砖块测试 在树莓派上完成ROS核心栈以及支持NXT Mindstorms砖块和传感器的额外ROS组件的安装后,我们就可以开始进行一系列的测试,以确保ROS与NXT砖块能够正常连接和工作。 测试ROS与NXT砖块的连接 准备工…

张小明 2025/12/25 18:16:30 网站建设

网站的开发公司倒闭对网站使用物业网站建设

整数变量、算术运算与数组的深入解析 在编程和脚本编写中,整数变量、算术运算以及数组是非常重要的概念。下面将详细介绍这些内容,包括整数变量的使用、算术条件判断、数组的操作等,并通过具体的代码示例进行说明。 整数变量与算术运算 算术表达式求值 :在 shell 中,$…

张小明 2025/12/25 1:55:45 网站建设

上传图片做网站维护南昌定制网站开发多少钱

Modern Management Science & Engineering (现代管理科学与工程) 是一本由 Scholink 出版的国际性、审稿人、双盲、同行评审、开放获取期刊。MMSE的使命是为世界各地的专家和学者提供一个高水平的平台,分享他们最新的管理理念,促进学科的繁荣。期刊名…

张小明 2025/12/28 7:00:10 网站建设

企业内部网站建设教程做花型设计哪个网站下载素材好

IOC在Spring当中被称之为控制反转,可以说是java生态当中的一个非常重要的底层思维,而控制反转这一思想能大大帮助程序解耦,而依赖注入也就是DI是实现IOC的一种手段,帮助java完成这样的一套思维逻辑,因此这两点在面试当…

张小明 2025/12/25 18:16:29 网站建设

wordpress 图片站分销系统

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 项目介绍 本系统共有管理员,用户2个角色,具体功能如下: 1.管理员角色的功能主要包括管理员登录,用户管理,菜品分类管理,菜品信息管理&…

张小明 2025/12/25 18:16:28 网站建设

南漳县建设局网站百度小说风云排行榜

ComfyUI高级Redux控制完整指南:如何精准控制图像生成效果 【免费下载链接】ComfyUI_AdvancedRefluxControl 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI_AdvancedRefluxControl ComfyUI_AdvancedRefluxControl是一个专门为ComfyUI设计的扩展插件&…

张小明 2025/12/25 18:16:28 网站建设