日期类的实现(C++编写)

本篇目录

  • 日期类的实现(C++编写)
    • 1.类与对象:
    • 2.日期类的实现
      • 2.1类的结构
      • 2.2类的构造函数
      • 2.3类的析构函数
      • 2.4类的拷贝构造函数
      • 2.5运算符重载
        • 2.5.1赋值运算符重载
        • 2.5.2+=运算符重载
        • 2.5.2+运算符重载
          • 2.5.3-=/-运算符重载
      • 3.总结
      • 4.完整代码

1.类与对象:

类与对象主要叙述了类的构造和用法,三种访问方式,还有6个默认成员函数的原理作用及使用。这一节知识点不再叙述了,类的操作主要还是需要实践的。我们通过日期类的实现可以有效的锻炼类的使用。

2.日期类的实现

2.1类的结构

首先要使用类必须明白类的结构

class className { // 类体:由成员函数和成员变量组成

}; // 一定要注意后面的分号

2.2类的构造函数

#include<iostream>
using namespace std;
class Data
{public:Data(int year = 2020, int month = 5, int day = 30){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};

通过构造函数实现对类中自定义对象进行初始化

2.3类的析构函数

由于类在构造函数时没有进行空间申请,所以我们调用析构函数时不用手动释放资源,直接调用系统默认的析构函数

 ~Data(){};

2.4类的拷贝构造函数

拷贝构造函数可以理解为将一个类对象的成员复制粘贴的同一个类中另一个类对象上(你抄你哥作业)

Data(const Data& d){_year = d._year;_month = d._month;_day = d._day;}

2.5运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类
型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

注意: 不能通过连接其他符号来创建新的操作符:比如operator@ 重载操作符必须有一个类类型或者枚举类型的操作数
用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义

作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的 操作符有一个默认的形参this,限定为第一个形参 .* 、::
、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

2.5.1赋值运算符重载

功能与拷贝构造函数一样,原理类似,只不过实现方式不同

 Data& operator=(const Data& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}

2.5.2+=运算符重载

通过运算符重载实现日期类中日期+=的操作,但是日期类中日期+=操作需要进行特殊的处理,比如一个月不可能存在33天,并且平年和闰年二月也不相同
首先要判断是否是闰年

bool IsLeapyear(int year){return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));}

确定每个月的天数,实现日期的进位

int GetmonthDay(int year, int month){static int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (IsLeapyear(year) && month == 2){return 29;}else{return monthday[month];}}

+=运算符重载实现日期进位

Date& operator+=(int day){_day += day;while (_day > GetmonthDay(_year, _month)){_day = _day - GetmonthDay(_year, _month);_month += 1;if (_month > 12){++_year;_month = 1;}}return *this;}

2.5.2+运算符重载

通过拷贝this,复用+=运算符,实现

Date operator+(int day)
//不会改变原来日期值,日期加上天数{Date ret = *this;//拷贝this指针return ret += day;}
2.5.3-=/-运算符重载

与+=/+运算符原理相同,不再细说

Date& operator-=(int day){if (day < 0){return *this += (-day);}_day = _day - day;while (_day < 1){_month -= 1;if (_month == 0){_month = 12;--_year;}_day += GetmonthDay(_year, _month);}return *this;}Date operator-(int day){Date ret = *this;return ret -= day;}

3.总结

通过日期类的实现,来使用了类与对象,掌握到默认成员函数的用法

4.完整代码

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#pragma once
using namespace std;class Date
{public://构造函数并初始化Date(int year = 2018, int month = 1, int day = 1):_year(year),_month(month),_day(day){}//析构函数~Date(){}//拷贝构造函数Date(const Date& d)//必须传引用,否则会出现无限递归{_year = d._year;_month = d._month;_day = d._day;}//赋值运算符重载Date& operator=(const Date& d){if (this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}//判断平年闰年bool IsLeapyear(int year)//判断是否为闰年{return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);}//确定每个月的天数int GetmonthDay(int year, int month){static int monthday[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (IsLeapyear(year) && month == 2){return 29;}else{return monthday[month];}}//运算符重载bool operator==(const Date& d){return _year == d._year&&_month == d._month&&_day == d._day;}Date& operator+=(int day){_day += day;while (_day > GetmonthDay(_year, _month)){_day = _day - GetmonthDay(_year, _month);_month += 1;if (_month > 12){++_year;_month = 1;}}return *this;}Date operator+(int day)//不会改变原来日期值,日期加上天数{Date ret = *this;//拷贝this指针return ret += day;}Date& operator-=(int day){if (day < 0){return *this += (-day);}_day = _day - day;while (_day < 1){_month -= 1;if (_month == 0){_month = 12;--_year;}_day += GetmonthDay(_year, _month);}return *this;}Date operator-(int day){Date ret = *this;return ret -= day;}void PrintDate1(){cout << "原来的日期" << _year << "-" << _month << "-" << _day << endl;}void PrintDate2(){cout << "加日期后的日期" << _year << "-" << _month << "-" << _day << endl;}void PrintDate3(){cout << "加日期后的日期" << _year << "-" << _month << "-" << _day << endl;}void PrintDate4(){cout << "减掉日期后的日期" << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;};int main(){Date d1(2019, 9, 18);d1.PrintDate1();Date d2;d2 = d1 + 66;d2.PrintDate2();Date d3;d3 += 66;d3.PrintDate3();Date d4 = d1 - 66;d4.PrintDate4();system("pause");return 0;}

日期类的实现(C++编写练习类与对象)相关推荐

  1. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  2. 编写类的步骤编写测试类

    目录 1,编写类的步骤 1,编写类 2,编写属性,也叫做成员变量 3,编写方法 2,编写测试类就是含有main方法的类 3.编写对象 1,编写类的步骤 1,编写类 编写类的格式:修饰符 class 类 ...

  3. 编写矩形类 计算矩形面积

    编写矩形类 计算矩形面积 public class juxing {int a;int b; juxing(int a,int b){System.out.println("矩形面积s=&q ...

  4. C++编写Config类读取配置文件

    老外写的一段代码,在Server中编写这个类读取配置文件比较实用 C++代码   //Config.h #pragma once #include <string> #include &l ...

  5. 《JAVA练习题目8》 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number

    题目内容: 编写一个类Person,包含的属性和方法如下: 属性:字符串类型的名字name,字符类型的性别gender,和整型的序号number:方法:showMe,以"name-gende ...

  6. ADO.NET复习——自己编写SqlHelper类

    今天复习了一次ADO.NET基础,整理一下自己的认为的重点: 编写SqlHelper类,方便我们执行数据库语句,这时可以直接调用封装在SqlHelper类的方法.现在大多数公司面试的时候,给你的面试题 ...

  7. python中编完类后到实例编写_[零基础学python]编写类之一创建实例

    虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有. 本讲就要简单多了,尝试走一个类的流程. 说明:关于类的这部分,我参考了<Learning Pyth ...

  8. php 单例类 mysql pdo_PHP实战:PHP基于单例模式编写PDO类的方法

    <PHP实战:PHP基于单例模式编写PDO类的方法>要点: 本文介绍了PHP实战:PHP基于单例模式编写PDO类的方法,希望对您有用.如果有疑问,可以联系我们. 一.单例模式简介 简单的说 ...

  9. Redox随笔(1)-用Rust语言编写的类UNIX操作系统

    Redox是一个用Rust语言编写的类UNIX操作系统 , 它的目标是把Rust语言的创新带入到一个现代的微内核和全系列的应用程序. https://www.redox-os.org/zh/docs/ ...

最新文章

  1. 最让程序员自豪的事情是什么?
  2. 归纳苹果,Facebook大规模部署的Spark-用户界面详细执行操作。
  3. PTA基础编程题目集-6-1 简单输出整数
  4. CVE-2012-1876 Internet Exporter堆溢出漏洞分析
  5. 2014年5月生日会
  6. raid硬盘序列号_磁盘阵列出现坏盘,如何正确更换硬盘?
  7. c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...
  8. Eclipse中快速查找类或代码
  9. 倒计时 妙味课堂_妙味课堂javascript视频教程
  10. vlan internal allocation policy ascending解释
  11. vue3.0+ts+element-plus多页签应用模板:侧边导航菜单(下)
  12. 如何使用Loadrunner12在win10系统 最新版本谷歌浏览器录制脚本
  13. 大咖说开源|郑振宇:通过开源手段巩固基础软件供应链
  14. 浏览器运作原理笔记(来自up主objtube的卢克儿的视频)
  15. pta中java编程题_多文件编程题
  16. java生成PDF,并下载到本地
  17. python100到200的素数_python 100~200的素数和
  18. C++ 封装一个简单的String
  19. 文件上传的http请求类(zip文件)
  20. zeromq源代码分析2------线/进程间通信方式

热门文章

  1. 【转】Quartz概述及入门实例
  2. 在Win10系统下使用与安装metis
  3. 在maven中的pom.xml配置ojdbc报错
  4. 推荐系统实战——自动化构建用户以及物料画像
  5. 数字媒体概论——声音
  6. 不小心删了(或覆盖了)window系统变量的PATH的怎么办?
  7. java日志管理-学习(一)
  8. 【漫画】各大互联网公司的真实“人”生
  9. Reso | php面试题(mysql基础)
  10. 腾讯微信技术总监:十亿用户增长背后的架构秘密