设计一个日期类Date,重载运算符“<<”使之能够使用cout将日期类对象以日期的格式输出在Date类中验证日期的合法性 cout <<“当前日期已设置为” << a < endl; 运行结果:当前日期: 2023 15 6无效的日期!当期日期:2023 5 31当前日期已设置为2023年5月31日!日期由客户输入
时间: 2024-03-13 11:45:23 浏览: 26
好的,我来设计一个符合要求的日期类Date。
首先,我们需要定义一个日期类Date,包括年、月、日三个成员变量,以及一些成员函数,如下所示:
```cpp
class Date {
public:
Date();
Date(int y, int m, int d);
friend std::ostream& operator<<(std::ostream& os, const Date& date);
private:
int year_;
int month_;
int day_;
};
```
其中,构造函数Date()用于初始化日期为当前系统日期,构造函数Date(int y, int m, int d)用于自定义日期,运算符重载函数operator<<用于将日期输出为标准格式。
接下来,我们需要实现这些函数。首先是构造函数Date(),它可以使用ctime库中的函数获取当前系统日期:
```cpp
Date::Date() {
std::time_t now = std::time(nullptr);
std::tm* t = std::localtime(&now);
year_ = t->tm_year + 1900;
month_ = t->tm_mon + 1;
day_ = t->tm_mday;
}
```
然后是构造函数Date(int y, int m, int d),我们需要验证输入的日期是否合法:
```cpp
Date::Date(int y, int m, int d) {
if (y < 0 || m < 1 || m > 12 || d < 1 || d > 31) {
std::cerr << "无效的日期!" << std::endl;
year_ = month_ = day_ = 0;
return;
}
if ((m == 4 || m == 6 || m == 9 || m == 11) && d > 30) {
std::cerr << "无效的日期!" << std::endl;
year_ = month_ = day_ = 0;
return;
}
if (m == 2) {
if (d > 29) {
std::cerr << "无效的日期!" << std::endl;
year_ = month_ = day_ = 0;
return;
}
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
if (d > 29) {
std::cerr << "无效的日期!" << std::endl;
year_ = month_ = day_ = 0;
return;
}
} else {
if (d > 28) {
std::cerr << "无效的日期!" << std::endl;
year_ = month_ = day_ = 0;
return;
}
}
}
year_ = y;
month_ = m;
day_ = d;
}
```
最后是运算符重载函数operator<<,它将日期输出为标准格式"yyyy-mm-dd":
```cpp
std::ostream& operator<<(std::ostream& os, const Date& date) {
if (date.year_ == 0 || date.month_ == 0 || date.day_ == 0) {
os << "无效的日期!";
return os;
}
os << date.year_ << "-" << std::setfill('0') << std::setw(2) << date.month_ << "-" << std::setfill('0') << std::setw(2) << date.day_;
return os;
}
```
现在,我们可以使用这个日期类了。以下是一个使用示例,可以从控制台输入日期并将其输出:
```cpp
int main() {
int year, month, day;
std::cout << "请输入年月日,以空格分隔:" << std::endl;
std::cin >> year >> month >> day;
Date date(year, month, day);
std::cout << "当前日期已设置为" << date << std::endl;
return 0;
}
```
希望这个日期类能够满足你的需求!