C++类与对象之日期类的实现

目录
  • 1. 实现前的铺垫
  • 2. 日期类的实现
    • 2.1 日期+=天数
    • 2.2 日期-=天数
    • 2.3 日期-天数
    • 2.4 日期+天数
    • 2.5 前置++
    • 2.6 后置++
    • 2.7 前置–
    • 2.8 后置–
    • 2.9 >运算符重载
    • 2.10 ==运算符重载
    • 2.11 >=运算符重载
    • 2.12 <运算符重载
    • 2.13 <=运算符重载
    • 2.14 !=运算符重载
    • 2.15 日期-日期 返回天数
    • 2.16 输出

1. 实现前的铺垫

在实现前,我们要先把类写好,类中包含成员函数和成员变量。
对于日期类来说,拷贝构造和赋值运算符可以不写,但是我在类中写了,也没关系哦。

#include<iostream>

using std::cout;
using std::endl;
using std::cin;

class Date
{

public:
//构造函数
 Date(int year = 0, int month = 1, int day = 1)
 {
  if (year >= 0 && month > 0 && month<13 && day>0 && day <= GetMonthDay(year, month))
  {
   _year = year;
   _month = month;
   _day = day;
  }
  else
  {
   cout << "输入日期不和法" << endl;
  }
 }
//拷贝构造
 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;
 }
 //判断合法性
 int GetMonthDay(int year, int month);
 //输出日期
 void prit();
 //日期+=
 Date& operator+=(int day);
 //日期+
 Date operator+(int day);
 //日期-=
 Date& operator-=(int day);
 //日期-
 Date operator-(int day);
 //日期==
 bool operator==(const Date& d);
 //日期>
 bool operator>(const Date& d);
 //日期!=
 bool operator != (const Date& d);
 //<
 bool operator < (const Date& d);
 //>=
 inline bool operator >= (const Date& d);
 //<=
 bool operator <= (const Date& d);
 //++d
 Date& operator++();
 //d++
 Date& operator++(int);
 //--d
 Date& operator--();
 //d--
 Date& operator--(int);
 //日期-日期
 int operator-(const Date& d);

private:
 int _year;
 int _month;
 int _day;
};
//给出当年当月的天数
inline int Date::GetMonthDay(int year, int month)
{
 static int dayArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 dayArray[2] = 28;
 if (month == 2 && ((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)
 {
  dayArray[2] = 29;
 }
 return dayArray[month];
}

2. 日期类的实现

在实现前我们先要利用复用,复用就是把已经写好的函数来完成要完成的函数。

2.1 日期+=天数

在这里,就复用了(日期-=天数的)函数
对于+=,当加一个天数是为正的时候(如:100),
但当加的天数为负数时(如:-100)
这里就要先判断day是否为正负数
如果为正数就正常加,如果是负数就复用-=操作符重载函数

详细请看下面:

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

 return *this;
}

2.2 日期-=天数

这里也和+=操作符重载函数一样,都要判断day是否为正负值

Date& Date::operator-=(int day)
{
 if (day > 0)
 {
  _day -= day;
  while (_day <= 0)
  {
   _month--;
   _day += GetMonthDay(_year, _month);
   if (_month == 0)
   {
    _year--;
    _month = 12;
   }
  }
 }
 else
 {
  *this += (-day);
 }
 return *this;
}

2.3 日期-天数

减天数,自己没变,所以要创个临时变量。

Date Date::operator-(int day)
{
 Date ret(*this);
 ret -= day;
 return *ret;
}

2.4 日期+天数

与减天数同理

Date Date::operator+(int day)
{
 Date ret(*this);
 ret += day;
 return ret;
}

2.5 前置++

对于前置和后置,在函数命名的时候,后置的参数列表多一个int来占位。

Date& Date::operator++()
{
 *this += 1;
 return *this;
}

2.6 后置++

Date& Date::operator++(int)
{
 Date tmp(*this);
 tmp += 1;
 return *this;
}

2.7 前置–

Date& Date::operator--()
{
 *this -= 1;
 return *this;
}

2.8 后置–

Date& Date::operator--(int)
{
 Date tmp(*this);
 tmp -= 1;
 return *this;

2.9 >运算符重载

bool Date::operator>(const Date& d)
{
 if (_year > d._year)
 {
  return true;
 }
 else if (_year == d._year)
 {
  if (_month > d._month)
  {
   return true;
  }
  else if (_month == d._month)
  {
   if (_day > d._day)
   {
    return true;
   }
  }
 }

 return false;
}

2.10 ==运算符重载

bool Date::operator==(const Date& d)
{
 return _year == d._year
  &&_month == d._month
  &&_day == d._day;

}

2.11 >=运算符重载

这里就开始复用>和==的操作符重载函数

bool Date::operator >= (const Date& d)
{
 return (*this > d) || (*this == d);
}

2.12 <运算符重载

bool Date::operator < (const Date& d)
{
 return !(*this>d);

}

2.13 <=运算符重载

bool Date::operator <= (const Date& d)
{
 return (*this < d) || (*this == d);
}

2.14 !=运算符重载

bool Date::operator != (const Date& d)
{
 return !(*this == d );
}

2.15 日期-日期 返回天数

int Date::operator-(const Date& d)
{
 Date max = *this;
 Date min = d;
 int flag = 1;
 if (max < min)
 {
  max = d;
  min = *this;
  flag = -1;
 }
 int m = 0;
 while (max!=min)
 {
  ++min;
  ++m;
 }

 return m*flag;
}

2.16 输出

void Date::prit()
{
 cout << _year << "年" << _month << "月" << _day << "日" << endl;
}

到此这篇关于C++类与对象之日期类的实现的文章就介绍到这了,更多相关C++日期类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于C++STL string类的介绍及模拟实现

    目录 一.标准库中的string类 1.string类 2.string类中的常用接口说明+模拟实现 2.1 string类对象的常见构造+模拟实现 2.2 string类对象的容量操作+模拟实现 2.3 string类对象的访问及遍历操作+模拟实现 2.4 string类对象的修改操作+模拟实现 2.5 string类非成员函数+模拟实现 一.标准库中的string类 1.string类 字符串的表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专

  • C++实现日期类(Date)

    本文实例为大家分享了C++实现日期类的具体代码,供大家参考,具体内容如下 #include<iostream> #include<stdlib.h> using namespace std; class Date { public: //构造函数 Date(int year = 1900, int month = 1, int day = 1) :_year(year) , _month(month) , _day(day) { if (!IsInvalidDate(_year,

  • C++实现日期类(Date类)的方法

    如下所示: #include<iostream> using namespace std; class Date { public: Date(int year = 1900, int month = 1, int day = 1) //构造 :_year(year) , _month(month) , _day(day) { if (!isInvalidDate(_year, _month, _day)) { _year = 1900; _month = 1; _day = 1; } } D

  • C++ 函数模板和类模板详情

    目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式化 2.3 函数模板原理 2.4 函数模板实例化 2.5 模板参数的匹配原理 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通用的交换函数? 在C++中可以用到函数重载 class A { public: void Swap(int& x1,int& x2) { int temp=x1; x1=x2; x2=temp; } void Swap(double&

  • C++中对象与类的详解及其作用介绍

    目录 什么是对象 面向过程 vs 面向对象 面向过程 面向对象 什么是类 类的格式 类的成员函数 函数访问权限 方法一 方法二 方法三 inline 成员函数 什么是对象 任何事物都是一个对象, 也就是传说中的万物皆为对象. 对象的组成: 数据: 描述对象的属性 函数: 描述对象的行为, 根据外界的信息进行相应操作的代码 具有相同的属性和行为的对象抽象为类 (class) 类是对象的抽象 对象则是类的特例 面向过程 vs 面向对象 面向过程 面向过程的设计: 围绕功能, 用一个函数实现一个功能

  • C++类与对象之日期类的实现

    目录 1. 实现前的铺垫 2. 日期类的实现 2.1 日期+=天数 2.2 日期-=天数 2.3 日期-天数 2.4 日期+天数 2.5 前置++ 2.6 后置++ 2.7 前置– 2.8 后置– 2.9 >运算符重载 2.10 ==运算符重载 2.11 >=运算符重载 2.12 <运算符重载 2.13 <=运算符重载 2.14 !=运算符重载 2.15 日期-日期 返回天数 2.16 输出 1. 实现前的铺垫 在实现前,我们要先把类写好,类中包含成员函数和成员变量. 对于日期类来

  • Java 类与对象超基础讲解

    目录 什么是面向对象 面向过程与面向对象 类与对象的使用 类与对象的使用与说明 对象的初始化 this的使用 构造方法 this可以调用本类的构造方法 什么是面向对象 Java语言是一个纯面向对象的语言,面向对象的语言不仅只有Java,包括C++,PHP等 面向对象的编程思想简称 OOP(Object Oriented Programming),其基本特点就是封装,继承和多态. 面向过程与面向对象 想要弄清楚什么是面向对象,首先需要知道两者的区别 面向过程更注重程序的每一个步骤,用相应的函数来实

  • 一文搞懂Java中的日期类

    目录 一.日期类 1.1 第一代日期类 1.2 第二代日期类Calendar 1.3 第三代日期类 一.日期类 在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的支持.在最初的版本下,java.lang包中的System.currentTimeMillis();可以获取当前时间与协调时间(UTC)1970年1月1日午夜之间的时间差(以毫秒为单位测量).我们往往通过调用该方法计算某段代码的耗时. public class TestTime { public stati

  • Python面向对象编程中的类和对象学习教程

    Python中一切都是对象.类提供了创建新类型对象的机制.这篇教程中,我们不谈类和面向对象的基本知识,而专注在更好地理解Python面向对象编程上.假设我们使用新风格的python类,它们继承自object父类. 定义类 class 语句可以定义一系列的属性.变量.方法,他们被该类的实例对象所共享.下面给出一个简单类定义: class Account(object): num_accounts = 0 def __init__(self, name, balance): self.name =

  • 一篇文章搞懂Python的类与对象名称空间

    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 函数内部可嵌套函数,嵌套函数有更内一层的名称空间 类代码块,名称空间为类自身 类中可定义函数,类中的函数有自己的名称空间,在类的内层 类的实例对象有自己的名称空间,和类的名称空间独立 类可继承父类,可以链接至父类名称空间 正是这一层层隔离又连接的名称空间将变量.类.对象.函数等等都组织起来,使得它

  • Python面向对象思想与应用入门教程【类与对象】

    本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在生活中: 它是一种看待问题的思维方式,在思考问题的时候,着眼问题是怎样一步一步解决的,然后亲力亲为去解决问题[类似于公司里的执行者]. 在程序中: ​ 代码是从上而下顺序执行,各个模块之间的关系尽可能简单,在功能上相对独立,程序的流程在写程序的时候就已经决定. 面向对象 在生活中: 它是另一种看待问

  • c++ 类和对象总结

    话不多说,我们直接进入主题: 对象:客观世界里的一切事物都可以看作是一个对象,每一个对象应当具有属性(静态特征,比如一个班级,一个专业,一个教室)和行为(动态特征,例如:学习,开会,体育比赛等)两个要素. 对象是由一组属性和一组行为构成的. 类(class):就是对象的类型,代表了某一批对象的共同特性和特征.类是对象的抽象,而对象是类的具体实例. 2.1 类的引入 在C语言中我们定义一个结构体是这样定义的: struct Student { int _age; char* _Gender; ch

  • Java全面细致讲解类与对象

    目录 类和对象的关系 类和对象的实例化 static关键字 private实现的封装 构造方法 this关键字 代码块 匿名对象 小结 类和对象的关系 类就是一类对象的统称.对象就是这一类具体化的一个实例. (对象是类的实例化) 对象是什么? 此对象非彼对象!!!说到对象就要提到过程. 面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.面向过程注重的是过程,在整个过程中所涉及的行为,就是功能. 面向对象:JAVA是基于面向对象的,关注的是对象,将一件事情

  • Java Scala数据类型与变量常量及类和对象超详细讲解

    目录 一.数据类型 二.变量和常量 三.类和对象 3.1 类 3.2 对象 3.3 伴生类和伴生对象 3.4 Scala的main函数只能写在object里 总结 一.数据类型 简记: 所有基础类型基本与Java的包装类等同,唯一有不同的Int(Scala),Integer(Java),注意这个就好 Unit, Null, Nothing, Any, AnyRef, AnyVal,这几个除了Null乍一眼会有些陌生,不要怕,上总结: 首先是层级图: 然后是表格: 补丁: 记住Any是所有类型的超

  • [ASP.NET AJAX]Function对象及Type类的方法介绍

    上一回我们从总体上认识了JavaScript Microsoft AJAX Library由于临时有事,没有加入事例显得有点抽象,这一回一定会通过一些事例更加直观的来会一会Asp.NET Ajax脚本库中一个很是重要的类Type.这个类提供了一些扩展面向对象编程的一些反射方法,通过这个类我们可以注册类似.NET中的一些(如:命名空间,类,枚举等等)基本类型.这个Type类继承自window是一个Global类型,不属于任何命名空间.下面我们来看看Type中的一些基本方法以及是怎样实一些方法的实现

随机推荐