#include<iostream>
using namespace std;
class time{
public:
int second;
int min;
~time(){}
};
class Date{
public:
Date(int dd,int mm,int yy);
Date()
{
t = new time;
d = 1;
m = 1;
y = 2006;
t->min = 0;
t->second = 0;
t = NULL;
}
Date& add_year(int n){ y += n; return *this;}
Date& add_month(int n){ m += n; return *this;}
Date& add_day(int n) { d += n; return *this;}
~Date(){
delete t;
}
void display() const;
private:
/*mutable*/ int d,m,y;
static Date default_date;
time *t;
};
Date Date::default_date = Date();
inline Date::Date(int dd,int mm,int yy)
{
if(t==NULL) cout<<"yes"<<endl;
t = new time;
d = dd ? dd:default_date.d;
m = mm ? mm:default_date.m;
y = yy ? yy:default_date.y;
t->second = 12;
t->min = 32;
}
inline void Date::display() const
{
Date *ptod = const_cast<Date *>(this);
cout<<ptod->d+1 <<"/"<<ptod->m+1<<"/"<<ptod->y+1<<endl;
}
int main()
{
Date d(0,0,0);
d.display();
d.add_year(1).add_month(1).add_day(1);
d.display();
}
我想提醒大家的就是 time *t 已经在 Date Date::default_date = Date(); 中初始化(初试化时间是在进入main函数之前,也就是在定义Date的时候初始化的) 所以t不属于任何对象.
那么在定义了 对象d之后就调用Date(int dd,int mm,int yy),这个时候this指针是指向 对象d的,所以Date(int dd,int mm,int yy)里面的t是属于对象d的,那么如果企图想在Date(int dd,int mm,int yy)里面delete Date()里new分配的内寸单元就会出错
原因是t属于的对象不同,一个是属于无名对象,一个是属于d.