赞
踩
Date.h
#pragma once #include<iostream> using namespace std; #include<assert.h> class Date { // 友元函数声明 friend ostream& operator<<(ostream& out, const Date& d); friend istream& operator>>(istream& in, Date& d); public: Date(int year = 1900, int month = 1, int day = 1); void Print() const; // 直接定义类⾥⾯,他默认是inline // 频繁调⽤ int GetMonthDay(int year, int month) { assert(month > 0 && month < 13); static int monthDayArray[13] = { -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 365天 5h + if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) { return 29; } else { return monthDayArray[month]; } } bool CheckDate(); bool operator<(const Date& d) const; bool operator<=(const Date& d) const; bool operator>(const Date& d) const; bool operator>=(const Date& d) const; bool operator==(const Date& d) const; bool operator!=(const Date& d) const; // d1 += 天数 Date& operator+=(int day); Date operator+(int day) const; // d1 -= 天数 Date& operator-=(int day); Date operator-(int day) const; // d1 - d2 int operator-(const Date& d) const; // ++d1 -> d1.operator++() Date& operator++(); // d1++ -> d1.operator++(0) // 为了区分,构成重载,给后置++,强⾏增加了⼀个int形参 // 这⾥不需要写形参名,因为接收值是多少不重要,也不需要⽤ // 这个参数仅仅是为了跟前置++构成重载区分 Date operator++(int); Date& operator--(); Date operator--(int); // 流插⼊ // 不建议,因为Date* this占据了⼀个参数位置,使⽤d<<cout不符合习惯 //void operator<<(ostream& out); private: int _year; int _month; int _day; }; // 重载 ostream& operator<<(ostream& out, const Date& d); istream& operator>>(istream& in, Date& d);
Date.cpp
#include"Date.h" bool Date::CheckDate() { if (_month < 1 || _month > 12 || _day < 1 || _day > GetMonthDay(_year, _month)) { return false; } else { return true; } } Date::Date(int year, int month, int day) { _year = year; _month = month; _day = day; if (!CheckDate()) { cout << "⽇期⾮法" << endl; } } void Date::Print() const { cout << _year << "-" << _month << "-" << _day << endl; } // d1 < d2 bool Date::operator<(const Date& d) const { if (_year < d._year) { return true; } else if (_year == d._year) { if (_month < d._month) { return true; } else if (_month == d._month) { return _day < d._day; } } return false; } // d1 <= d2 bool Date::operator<=(const Date& d) const { return *this < d || *this == d; } bool Date::operator>(const Date& d) const { return !(*this <= d); } bool Date::operator>=(const Date& d) const { return !(*this < d); } bool Date::operator==(const Date& d) const { return _year == d._year && _month == d._month && _day == d._day; } bool Date::operator!=(const Date& d) const { return !(*this == d); } // d1 += 50 // d1 += -50 Date& Date::operator+=(int day) { if (day < 0) { return *this -= -day; } _day += day; while (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); ++_month; if (_month == 13) { ++_year; _month = 1; } } return *this; } Date Date::operator+(int day) const { Date tmp = *this; tmp += day; return tmp; } // d1 -= 100 Date& Date::operator-=(int day) { if (day < 0) { return *this += -day; } _day -= day; while (_day <= 0) { --_month; if (_month == 0) { _month = 12; _year--; } // 借上⼀个⽉的天数 _day += GetMonthDay(_year, _month); } return *this; } Date Date::operator-(int day) const { Date tmp = *this; tmp -= day; return tmp; } //++d1 Date& Date::operator++() { *this += 1; return *this; } // d1++ Date Date::operator++(int) { Date tmp(*this); *this += 1; return tmp; } Date& Date::operator--() { *this -= 1; return *this; } Date Date::operator--(int) { Date tmp = *this; *this -= 1; return tmp; } // d1 - d2 int Date::operator-(const Date& d) const { Date max = *this; Date min = d; int flag = 1; if (*this < d) { max = d; min = *this; flag = -1; } int n = 0; while (min != max) { ++min; ++n; } return n * flag; } ostream& operator<<(ostream& out, const Date& d) { out << d._year << "年" << d._month << "⽉" << d._day << "⽇" << endl; return out; } istream& operator>>(istream& in, Date& d) { cout << "请依次输⼊年⽉⽇:>"; in >> d._year >> d._month >> d._day; if (!d.CheckDate()) { cout << "⽇期⾮法" << endl; } return in; }
Test.cpp
#include"Date.h" void TestDate1() { // 这⾥需要测试⼀下⼤的数据+和- Date d1(2024, 4, 14); Date d2 = d1 + 30000; d1.Print(); d2.Print(); Date d3(2024, 4, 14); Date d4 = d3 - 5000; d3.Print(); d4.Print(); Date d5(2024, 4, 14); d5 += -5000; d5.Print(); } void TestDate2() { Date d1(2024, 4, 14); Date d2 = ++d1; d1.Print(); d2.Print(); Date d3 = d1++; d1.Print(); d3.Print(); /*d1.operator++(1); d1.operator++(100); d1.operator++(0); d1.Print();*/ } void TestDate3() { Date d1(2024, 4, 14); Date d2(2034, 4, 14); int n = d1 - d2; cout << n << endl; n = d2 - d1; } void TestDate4() { Date d1(2024, 4, 14); Date d2 = d1 + 30000; // operator<<(cout, d1) cout << d1; cout << d2; cin >> d1 >> d2; cout << d1 << d2; } void TestDate5() { const Date d1(2024, 4, 14); d1.Print(); //d1 += 100; d1 + 100; Date d2(2024, 4, 25); d2.Print(); d2 += 100; d1 < d2; d2 < d1; } int main() { return 0; }
• 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后⾯。
• const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进⾏修改。const 修饰Date类的Print成员函数,Print隐含的this指针由 Date* const this 变为 const Date* const this
#include<iostream> using namespace std; class Date { ``public: Date(int year = 1, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } // void Print(const Date* const this) const void Print() const { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { // 这⾥⾮const对象也可以调⽤const成员函数是⼀种权限的缩⼩ Date d1(2024, 7, 5); d1.Print(); const Date d2(2024, 8, 5); d2.Print(); return 0; }
取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器⾃动
⽣成的就可以够我们⽤了,不需要去显⽰实现。除⾮⼀些很特殊的场景,⽐如我们不想让别⼈取到当
前类对象的地址,就可以⾃⼰实现⼀份,胡乱返回⼀个地址。
class Date { public : Date* operator&() { return this; // return nullptr; } const Date* operator&()const { return this; // return nullptr; } private : int _year ; // 年 int _month ; // ⽉ int _day ; // ⽇ };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。