类和对象3(日期类实现)

📅 2026/8/5 13:19:29
类和对象3(日期类实现)
函数内要使用类内的成员变量时不用再写形参类型直接用就行。若如下右图写则是构造函数里声明了局部变量_year/_month/_day覆盖了类的成员变量导致成员变量未被初始化。函数声明与定义分离.h中函数 类型 函数名参数列表.cpp中函数 类型 头文件中类名::函数名参数列表思考默认构造需要自己写初始化析构函数用默认无资源释放。拷贝构造赋值重载用默认无资源释放首先写构造函数初始化一个日期类再写一个打印函数再完成日期的加减比较设计一个函数要求传入年月后得到对应月份的天数(需判断是否是闰月年及二月天数)四年一润并且百年不润或者400年一润该数组常用设置为静态数组。assert对月份进行限定。该函数常用设置为类内内联函数。一、 实现 - -1.不断在自身上加不断改变自身所以.h中返回类型是Date 核心思想_dayday - 当前月天数当前天数用总天数按月扣天数直至所剩天数小于当前月天数这里的ifday0是传入负数时负数等于-正数 有两种方法2. -不断在自身上加不断改变自身所以.h中返回类型是Date 用当前月天数-要回溯的天数。若0,说明回溯后还在本月若0,说明回溯后不在本月当前月份天数以被减完借上一月份的天数继续减直至0这里的ifday0-负数等于正数- 有两种方法二、实现比较大小先实现比较 或 就可以轻松实现其它比较逻辑了这里实现了 这里将的情况按先年与年后月与月最后日与日都挑选出来了其他的情况直接 return false再实现其他三、实现前置后置 --返回类型依旧是Date返回更改后本身 或Date传值传参,返回更改后的对象参数为空后置时在参数位置写int用来区分前置int无具体含义不传参三、日期-日期有意义算出相差天数算年月日与年月日之间的差值即相差天数直接算就行实际d1 d2谁大谁小我们不知道设计算法找出d1 d2中大的和小的让小的不断加至大的其中加了多少次就隔了多少天n始终为正数。实际d1 d2相减结果可能为负数flag就可以实现对应情况四、检查月日是否正确加在构造函数后判断输入日期是否合理五、若想实现输入任意两个日期相减即可他们之间相隔天数需要重载 都是是双目运算符左侧操作数是cout在库内分别已经将 和 的运算符重载函数的函数重载如下图以 为例实现完成这就是c可以自动识别要输入输出的内置类型的原因我们将 重新重载底层实现时还是用到他们原来的重载实现将运算符函数放在日期类Date里面写成成员函数这样访问私有成员变量更方便。我们按重载函数中隐藏的this指针指向的是调用的日期类将cout是对象引用传参的准则设计重载函数。将运算符函数放在日期类Date里面函数设计如下图void Date::operator(ostream out)。有问题按原来的输入习惯coutd1调用时隐藏的this与形参out参数不匹配但如果将调用对象交换就行但不理想。此时将该函数放到.h文件的全局域中再加上日期类d变成全局函数即可符合使用习惯。在.cpp中完成该函数但此时无法方便的使用日期类内的成员函数及变量需在类内加上友元声明在类内写friend 函数在类外声明函数即可在类外访问私有成员变量此时仅能单次输入没有返回out形成链式输入如何让连续输入和赋值运算符相似赋值运算符是从右往左返回左操作数返回值是左操作数即cout,从左往右所以将函数类型再改为ostream即可实现其他与实现原理一样内部还是由原来的 实现全局函数需要友元需要链式实现因为要往对象内存数据所以去掉const。istream与ostream类型对象不支持拷贝构造不能传值传参传值返回。只能传引用传参传引用返回。将加入输入数据是否合法的Check判断如果一直输入错误就一直提示while循环break跳出循环读取整型空格 / 换行天然充当分隔符用来区分年、月、日三个数字。竞赛有要求时如下图d1调用不受const限制的成员函数相当于要将受const修饰的Date类地址传给不受const修饰的隐藏形参指针变量this应为this不受const修饰所以可以通过this修改对象内成员会将其权限放大此时可以改函数内部的私有成员变量如下图_year建议在函数内部不需要修改成员变量的成员函数都加上const。当我们想返回错误指针空的地址时以下三图代码一体对于A aa22; 这行代码发生了隐式类型转换。因为A的构造函数是一个支持单参数的构造函数所以语法上编译器先用常量2构造一个临时对象再用临时对象拷贝构造给aa2相当于构造对象A aa2(2)。编译器实际优化编译时不调用构造临时对象再调拷贝构造而是用常量2直接构造对象aa2。下图代码st.Push(3)中用3隐式类型转换构造了一个临时对象A aa2(3)。然后这里再没有发生类型转换只是要对临时对象A aa2(3)进行引用传参重命名临时对象由于有常性所以必须加const。由下图压栈时知以后不用先创建对象再将对象传参而是直接传创建对象时的要初始化的数据让编译器自动创建对象这样写起来更简单。注意形参要有const只有单参数时支持这样写多参数不支持当A的构造函数是一个支持多参数的构造函数与支持单参数的构造函数时相似只不过多个数据要用{}括起来若不想让隐式类型转换发生在对应构造函数前加关键字explicit即可