【C++初階】系統實現日期類

目錄

一.運算符重載實現各個接口

1.小于 (d1)<>

2.等于?(d1=d2)

3.小于等于(d1<=d2)

4.大于(d1>d2)

5.大于等于(d1>=d2)?

6.不等于(d1!=d2)?

7.日期+=天數?

(1) 算該年的每個月的天數

(2)日期+=天數 函數?

8.日期+天數

(1)拷貝構造形式?

(2)復用形式?

9.日期-=天數?

10.日期-天數?

11.實現operator++函數?

(1)前置++

(2)后置++?

12.日期-日期

?13.流插入運算符重載

14.流提取操作符重載?

15.檢查函數(防止日期錯誤)?


一.運算符重載實現各個接口

1.小于 (d1<d2)

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.等于?(d1=d2)

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

3.小于等于(d1<=d2)

?由于已經實現了小于和等于的接口,接下來我們直接復用讓代碼更加簡潔。

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

4.大于(d1>d2)

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

5.大于等于(d1>=d2)?

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

6.不等于(d1!=d2)?

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

7.日期+=天數?

  • 計算方式?

?

?

(1) 算該年的每個月的天數

//不進行聲明和定義分離,本質就是inline(這個函數在后面會被頻繁調用)int GetMonthDay(int year, int month){assert(month > 0 && month < 13);static int monthDays[13] = { 0,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;}return monthDays[month];}

(2)日期+=天數 函數?

//d1 += 10
Date& Date:: operator+=(int day)
{_day += day;while (_day > GetMonthDay(_year, _month)){_day -= GetMonthDay(_year, _month);++_month;if (_month == 13){++_year;_month = 1;}}return *this;
}

8.日期+天數

(1)拷貝構造形式?

//d1+10
Date Date:: operator+(int day)
{Date tmp(*this);//這里*this就是d1----(拷貝構造)tmp._day += day;while (_day > GetMonthDay(tmp._year, tmp. _month)){tmp._day -= GetMonthDay(tmp._year, tmp._month);++tmp._month;if (tmp._month == 13){++tmp._year;tmp._month = 1;}}return tmp;
}

(2)復用形式?

Date Date:: operator+(int day)
{Date tmp = *this;//拷貝構造tmp += day;return tmp;

9.日期-=天數?

  • ?計算方式

?

//日期-=天數
Date& Date::operator-=(int day)
{_day -= _day;while (_day <= 0){--_month;if (_month == 0){--_year;_month = 12;}_day += GetMonthDay(_year, _month);}return *this;
}

10.日期-天數?

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

11.實現operator++函數?

(1)前置++

//++d->d.operator++()
Date & Date::operator++()
{*this += 1;return *this;
}

(2)后置++?

//為了和前置++區分,強制增加了一個int形參,構成重載區分
// d++ ->d.operator++(0)
Date Date::operator++(int)
{Date tmp = *this;*this += 1;return tmp;
}

12.日期-日期

//日期-日期 d1-d2
int  Date::operator-(const Date & d)
{int flag = 1;Date max = *this;Date min = d;if (*this < d){int flag = -1;max = d;min = *this;}int n = 0;while (min != max){++min;++n;}return n * flag;
}

?13.流插入運算符重載

由于? <<? 只支持內置類型,所以我們需要自己寫一個函數來支持自定義類型的流插入。

ostream& operator<<(ostream& cout, const Date& d)
{cout << d._year << "年" << d._month << "月" << d._day << "日" << endl;return cout;
}operator<<(cout, d1);
cout << d1 << d2;
  • 注意
  1. 該函數不能寫成成員函數,只能放在全局。因為操作符左右兩側操作數的類型不匹配。
  2. 該函數不能放在Date.h文件中。因為要在兩個.cpp文件中包含Date.h頭文件,產生定義沖突,解決方法有兩個:第一,采用內聯的形式;第二,采用聲明和定義分離。?

?

14.流提取操作符重載?

//流提取
istream& operator>>(istream& in, Date& d)
{cout << "請依次輸入年、月、日";in >> d._year >> d._month >> d._day;return in;
}int main()
{cin >> d2 >> d1;cout << d2 << d1;
}

?

15.檢查函數(防止日期錯誤)?

bool Date::CheckInvalid()
{if (_year <= 0||_month<1||_month>12||_day<1||_day>GetMonthDay(_year,_month)){return false;}else{return true;}
}
  • 流提取改進?
//流提取
istream& operator>>(istream& in, Date& d)
{while (1){cout << "請依次輸入年、月、日: ";in >> d._year >> d._month >> d._day;if (!d.CheckInvalid()){cout << "輸入了非法日期,請重新輸入" << endl;}else{break;}}return in;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696252.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac圖片怎么轉換格式jpg?四種高效方法助你輕松搞定JPG格式

mac圖片怎么轉換格式jpg&#xff1f;在數字時代&#xff0c;圖片格式的轉換成為了我們日常操作中的一項基本技能。特別是在使用Mac操作系統的用戶中&#xff0c;如何將圖片轉換為JPG格式成為了一個熱門話題。本文將為你詳細介紹四種簡單實用的方法&#xff0c;幫助你在Mac上輕松…

測試基礎1:偉大航路喲呼(Linux基礎、mysql基礎)

1 測試流程和方法 軟件測試定義&#xff1a; 從方式上看&#xff1a;包含人工測試、自動化測試 從方法上看&#xff1a;運行程序或系統和測定程序或系統的過程 從目的上看&#xff1a;包括找bug和找bug出現的原因 軟件測試的原則&#xff1a;功能性、可靠性、易用性、效率性…

一、網絡基礎知識

1、IP地址和端口號 1.1、IP地址 定義&#xff1a;用于在網絡中唯一標識設備的地址。格式&#xff1a;通常由四個數字組成&#xff0c;以點分十進制表示&#xff0c;例如&#xff1a;192.168.0.1。(IPv4)作用&#xff1a;允許網絡中的設備相互通信&#xff0c;通過IP地址可以定…

Python 數據可視化之密度散點圖 Density Scatter Plot

&#x1f349; CSDN 葉庭云&#xff1a;https://yetingyun.blog.csdn.net/ 密度散點圖&#xff08;Density Scatter Plot&#xff09;&#xff0c;也稱為密度點圖或核密度估計散點圖&#xff0c;是一種數據可視化技術&#xff0c;主要用于展示大量數據點在二維平面上的分布情況…

Swift基礎知識:24.Swift可選鏈

在 Swift 中&#xff0c;可選鏈&#xff08;Optional Chaining&#xff09;是一種用于調用可選類型屬性、方法或下標的安全方式。可選鏈允許我們在調用鏈中的任何一個屬性、方法或下標返回 nil 時&#xff0c;整個調用鏈仍然可以繼續執行&#xff0c;而不會因為其中的任何一個可…

一樣的代碼不同項目跳轉頁面報404的解決辦法

今天收到實施反饋的一個問題&#xff0c;點項目名稱跳轉項目詳情頁面時&#xff0c;有的頁面跳轉顯示正常&#xff0c;有的頁面跳轉報404錯誤。錯誤如下&#xff1a; 發現報錯的項目都有一個共性就是有特殊字符“[ ]” , 解決的辦法就是把帶有特殊字符的字段 用 encodeURI()…

Java SE 入門到精通—4.抽象類與接口【Java】

抽象類 同接口一樣&#xff0c;用來約束子類&#xff0c;限制子類必須擁有某些方法&#xff0c;比普通類多了個抽象方法&#xff0c;用抽象方法該類必為抽象類 概念 沒有具體的對象&#xff0c;具體的方法的一個類 abstract關鍵字聲明為抽象類/方法 一個類中有抽象方法則該…

統計前端傳過來的Req的非空屬性個數的工具類

背景 日常開發中&#xff0c;我們通常會根據前端傳過來的實體類的屬性個數去做邏輯判斷&#xff0c;下面的是判斷屬性個數的工具類。 工具類 public static Integer nonNullFieldCount(Req req) {if (req null) {return 0;}int nonNullFieldCount 0;Field[] fields req.ge…

【Django】Django自定義后臺表單——對一個關聯外鍵對象同時添加多個內容

以官方文檔為例&#xff1a; 一個投票問題包含多個選項&#xff0c;基本的表單設計只能一個選項一個選項添加&#xff0c;效率較低&#xff0c;如何在表單設計中一次性添加多個關聯選項&#xff1f; 示例代碼&#xff1a; from django.contrib import adminfrom .models impo…

Java中的關鍵字有哪些?它們各自的作用是什么?請詳細說明?Java中的訪問修飾符有哪些?它們的訪問權限是怎樣的?

1、Java中的關鍵字有哪些&#xff1f;它們各自的作用是什么&#xff1f;請詳細說明&#xff1f; Java中的關鍵字是預先定義好的&#xff0c;具有特殊含義的標識符&#xff0c;用于表示數據類型、程序結構或控制流程等。以下是Java中的一些常用關鍵字及其作用&#xff1a; abs…

【軟件架構】02-復雜度來源

1、性能 1&#xff09;單機 受限于主機的CPU、網絡、磁盤讀寫速度等影響 在多線程的互斥性、并發中的同步數據狀態等&#xff1b; 擴展&#xff1a;硬件資源、增大線程池 2&#xff09;集群 微服務化拆分&#xff0c;導致調用鏈過長&#xff0c;網絡傳輸的消耗過多。 集…

嵌入式Qt 計算器核心算法_3

一.后綴表達式實現算數運算思路 二.算法實現 #include "QCalculatorDec.h"QCalculatorDec::QCalculatorDec() {m_exp "";m_result ""; }QCalculatorDec::~QCalculatorDec() {}bool QCalculatorDec::isDigitOrDot(QChar c) {return ((0 < c)…

基于SpringBoot的景區旅游管理系統

項目介紹 本期給大家介紹一個 景區旅游管理 系統.。主要模塊有首頁&#xff0c;旅游路線&#xff0c;旅行攻略&#xff0c;在線預定。管理員可以登錄管理后臺對用戶進行管理&#xff0c;可以添加酒店&#xff0c;景區&#xff0c;攻略&#xff0c;路線等信息。整體完成度比較高…

一文搞懂match、match_phrase與match_phrase_prefix的檢索過程

一、在開始之前&#xff0c;完成數據準備&#xff1a; # 創建映射 PUT /tehero_index {"settings": {"index": {"number_of_shards": 1,"number_of_replicas": 1}},"mappings": {"_doc": {"dynamic": …

探索氣膜球幕影院:未來的電影體驗

氣膜球幕影院作為一種新興的電影放映方式&#xff0c;正逐漸成為人們關注的焦點。它采用了充氣式膜結構&#xff0c;可以為觀眾帶來 360 度全景的觀影體驗&#xff0c;讓人仿佛置身于電影之中。本文將介紹氣膜球幕影院的特點、技術原理以及未來的發展前景。 傳說在古代&#x…

Linux系統運維命令:使用 tail,grep組合命令(包括wc,sort,awk,sed等),可以方便的查閱和操作正在改變的日志文件的具體內容

一、命令介紹 1、tail命令 tail命令是Linux系統中常用的命令之一&#xff0c;用于查看文件的末尾內容。它具有許多有用的選項&#xff0c;可以幫助用戶輕松地查找并顯示文件中的信息。 它默認顯示文件的最后10行&#xff0c;但可以通過各種選項來定制輸出的行數、字節數等。ta…

十四、圖像幾何形狀繪制

項目功能實現&#xff1a;矩形、圓形、橢圓等幾何形狀繪制&#xff0c;并與原圖進行相應比例融合 按照之前的博文結構來&#xff0c;這里就不在贅述了 一、頭文件 drawing.h #pragma once#include<opencv2/opencv.hpp>using namespace cv;class DRAWING { public:void…

Python筆記-super().init(root)的作用

假設我們有一個名為Animal的父類&#xff0c;它有一個屬性color&#xff0c;在其構造函數__init__中被初始化&#xff1a; class Animal:def __init__(self, color):self.color color現在&#xff0c;我們想創建一個Animal的子類&#xff0c;名為Dog。Dog類有自己的屬性name&…

QPaint繪制自定義儀表盤組件01

網上抄別人的&#xff0c;只是放這里自己看一下&#xff0c;看完就刪掉 ui Dashboard.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomm…

【xss跨站漏洞】xss漏洞前置知識點整理

xss漏洞成因 xss漏洞是一種前端javascript產生的漏洞。 我們網站基本都是會用到javascript編寫一些東西&#xff0c;瀏覽器也能直接識別javascript。 如果有一個地方能夠輸入文字&#xff0c;但是他又沒有過濾你的輸入&#xff0c;那么自己或者他人看到你輸入的javascript代…