利用运算符重载实现Date类

运算符重载:

重载,就是重新赋予新的含义。运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的,而且能实现在函数中指定的新的功能。在使用被重载的运算符时,系统会自动调用该函数,以实现相应的功能。即运算符重载实质是函数的重载。

重载运算符的格式如下:

函数类型 operator 运算符名称(形参表)

{

对运算符的重载处理

}

c++中绝大多数的运算符容许重载,不能重载的运算符只有5个:即

. (成员访问运算符)

* (成员指针访问运算符)

:: (域运算符)

sizeof (长度运算符)

?: (条件运算符)

例:创建一个Date类,实现日期+天数=日期,日期-天数=日期。

#define _CRT_SECURE_NO_WARNING 1

#include<iostream>

using namespace std;

class Date

{

public:

 Date(int year = 1900, int month = 1, int day = 1)

  :_year(year)

  , _month(month)

  , _day(day)

 {}

 int DayInMonth(Date &d)

 {

  int dys[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

  if ((_year % 4 == 0 && _year % 100 != 0) || (_year % 400 == 0))

  {

   dys[2] = 29;

  }

  return dys[d._month];

 }

 Date operator+(int day)

 {

  Date d1 = *this;

  d1._day += day;

  while (d1._day> DayInMonth(d1))

  {

   d1._day -= DayInMonth(d1);

   d1._month++;

   if (d1._month == 13)

   {

    d1._month = 1;

    d1._year++;

   }

  }

  return d1;

 }

 Date operator-(int day)

 {

  Date d1 = *this;

  d1._day -= day;

  while (d1._day <= 0)

  {

   d1._month--;

   d1._day += DayInMonth(d1);

   if (d1._month < 1)

   {

    d1._month = 12;

    d1._year--;

   }

  }

  return d1;

 }

 bool operator<(Date &d)

 {

  Date d1 = *this;

  if (d1._year < d._year)

  {

   return true;

  }

  if (d1._year == d._year &&d1._month < d._month)

  {

   return true;

  }

  if (d1._year == d._year&&d1._month == d._month&&d1._day < d._day)

  {

   return true;

  }

  return false;

 }

 int operator-(Date &d)

 {

  int day = 1;

  Date d1;

  while (d1 < d)

  {

   operator+(day);

   day++;

   if (d._year == _year&&d._month == _month&&d._day == _day)

   {

    break;

   }

  }

  return day;

 }

 void show()

 {

  cout << _year << "-" << _month << "-" << _day << endl;

 }

private:

 int _year;

 int _month;

 int _day;

};

int main()

{

 Date d1(2016, 1, 1);

 Date d2,d3;

 int days = 32;

 int day = 0;

 d2 = d1 + days;

 d3 = d1 - days;

 cout << "date+days" << endl;

 d2.show();

 cout << "date-days" << endl;

 d3.show();

 system("pause");

 return 0;

}
时间: 2024-10-06 00:01:41

利用运算符重载实现Date类的相关文章

第八周(运算符重载)Time类

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第八周(运算符重载) *作者:王忠 *完成日期:2015.4.28 *版本号:v1.0 * *问题描述:实现Time类中的运算符重载. *输入描述: *程序输出: #include <iostream> using namespace std; class CTime { private: unsigned short int hour; // 时 unsigned shor

C++之运算符重载自定义String类

我这里使用的是vs2013 希望可以帮助到大家 第一个文件 MyString.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class MyString{ friend ostream&operator<<(ostream& cout, MyString &str); friend istream&operator>&

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

C++:运算符重载函数之成员运算符重载函数

5.2.3 成员运算符重载函数 在C++中可以把运算符重载函数定义为某个类的成员函数,称之为成员运算符重载函数. 1. 定义成员运算符重载函数的语法形式 (1)在类的内部,定义成员运算符重载函数的格式如下: 函数类型 operator 运算符(形参表) {       函数体 } (2)成员运算符重载函数也可以在类中声明成员函数的原型,在类外定义. 在类的内部,声明成员运算符重载函数原型的格式如下: class X{      ...      函数类型 operator运算符(参数表); };

C++:运算符重载函数之友元运算符重载

5.2.2 友元运算符重载函数 运算符重载函数一般采用两种形式定义: 一是定义为它将要操作的类的成员函数(简称运算符重载函数): 二是定义为类的友元函数(简称为友元运算符重载函数). 1.定义友元运算符重载函数的语法如下: 在类的内部: friend 函数类型 operator运算符(形参表) { 函数体 } 在类的内部声明,在类外定义: class X{ ... friend 函数类型 operator运算符(形参表): }; 函数类型 X::operator运算符(形参表) { 函数体 }

Python——运算符重载(1)

运算符重载 关键概念: 1.运算符重载让类拦截常规的Python运算. 2.类可重载所有的Python表达式运算符. 3.类也可重载打印.函数调用.属性点号运算等内置运算. 4.重载使类实例的行为像内置类型. 5.重载是通过特殊名称的类方法来实现的. 运算符重载只是意味着在类方法中拦截内置的操作--当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果. =================================================

[转]C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 1 int i;2 int i1=10,i2=10;3 i=i1+i2;4 std::co

C++之运算符重载(1)

在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的.这一系列我将主要讲解C++中有关运算符重载方面的内容.在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解.而运算符重载的基础就是运算符重载函数.所以今天主要讲的是运算符重载函数. 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不同行为的发生.比如 int i; int i1=10,i2=10; i=i1+i2; std::cout<<