定义一个Date类,该类有year,month和day三个私有成员?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了定义一个Date类,该类有year,month和day三个私有成员?相关的知识,希望对你有一定的参考价值。

定义一个Date类,该类有year、month和day三个私有成员,用于存储日期的年、月和日信息。
为该类定义默认构造函数、带参的构造函数、复制构造函数和读写数据成员的函数setDate和showDate。
其中,setDate用于设置年月日信息,showDate用于输出日期信息。
在主函数中用不同的构造函数创建Date对象并进行测试。

注意:程序的开始部分(必要的文件包含和using namespace std; )和main函数已经写好了,你只需要定义Date类并实现它的成员函数即可(只需要提交这部分代码)。
main函数如下:
int main()
Date d1;
d1.showDate();
Date d2(2021,3,13);
d2.showDate();
d2.setDate(2021,5,1);
d2.showDate();
Date d3(d1);
d3.showDate();
return 0;


样例输出:
2021/4/16
2021/3/13
2021/5/1
2021/4/16

#include<iostream>
using namespace std;
class Date

private:
int year;
int month;
int day;
public:
Date(int y = 2021, int m = 4, int d = 16)

year = y;
month = m;
day = d;

Date(const Date & d)

year = d.year;
month = d.month;
day = d.day;

void setDate(int y, int m, int d)

year = y;
month = m;
day = d;

void showDate()

cout << year << "/" << month << "/" << day <<endl;

;
参考技术A TDate::SetDay(int nDay/*=1*/) m_nDay=nDay; void TDate::SetMonth(int nMonth/*=1*/) m_nMonth=nMonth; void

关于复制构造函数和 NRVO

【中文标题】关于复制构造函数和 NRVO【英文标题】:Regarding copy constructor and NRVO 【发布时间】:2015-11-18 03:09:32 【问题描述】:
class Date

private:
int day,month,year;
public:
Date (int d,int m,int y)

day=d;
month=m;
year=y;

Date (Date &d)
 
day=d.day;
month=d.month;
year=d.year;

int monthDays(int month,int year)

    if((year%4)==0)
    if(month==4 || month==6 || month==9 || month==11)
        return 30;
    
    else
    if(month==2)
        return 29;
    
    else
        return 31;
    
    else
        if(month==4 || month==6 || month==9 || month==11)
            return 30;
        
        else
        if(month==2)
            return 28;
        
        else
        return 31;
    

Date operator+ (const int k) 

    Date copy(day,month,year);
    int inc_days=k;
  if(inc_days<=(monthDays(copy.month,copy.year)-copy.day))
        copy.day+=inc_days;
        return copy;
    
    else
        inc_days-=(monthDays(copy.month,copy.year)-copy.day);
        copy.day=monthDays(copy.month,copy.year);
        while(inc_days>0)
            copy.year+=(copy.month/12);
            copy.month+=1-12*(copy.month/12);
            if(inc_days>monthDays(copy.month,copy.year))
                copy.day=monthDays(copy.month,copy.year);
                inc_days-=monthDays(copy.month,copy.year);
            
            else
                copy.day=inc_days;
                inc_days=0;
            
        
        return copy;
         

;
int main()

Date d1(2,3,2004); //uses another constructor //line 1
Date d3(d1); //line 2
Date d2=d1+2; //uses overloaded + operator //line 3

即使第 2 行没有将临时对象作为参数,如果我不在复制构造函数参数中添加 const,我仍然会收到编译器错误。 在第 3 行的情况下,重载的运算符使用 NRVO 返回一个对象。因此它不应该使用复制构造函数。但它仍然给出编译器错误。如果我在复制构造函数参数中添加一个 const,这两个错误都会消失。但是为什么它会给出错误呢?

【问题讨论】:

什么是Date?声明可能涉及此错误。确切的错误也会有所帮助。 请出示mcve。 Date 是我用 3 个私有变量 day、month 和 year 创建的类。 显示您的代码。我们不想猜测您输入的内容。单个字符可以改变 C++ 代码的含义。 @CodeMaxx - 如果你的Date 构造函数都是private,这段代码怎么编译?如果没有,请贴出真实代码,不要贸然打码。 【参考方案1】:

即使复制构造函数被编译器优化,代码仍然必须正确编译,就像理论上调用了复制构造函数一样。您需要将复制构造函数的参数设为 const 引用才能获取临时对象。

【讨论】:

理论上的电话也应该通过有什么具体原因吗?在任何特殊情况下有什么不同吗? @CodeMaxx 是一种安全机制。如果类不提供复制自身的安全方法,则在禁用时按值返回它,即使编译器可以优化副本。

以上是关于定义一个Date类,该类有year,month和day三个私有成员?的主要内容,如果未能解决你的问题,请参考以下文章

输入年year月month 求这个月有几天 要注意2月份的闰年

C++——拷贝构造和运算符重载

判断年月日是否正确

aix 下怎么显示昨天的日期

普通万年历效果

前置声明和头文件