#include<bits/stdc++.h>
using namespace std;
/**
* 通过 this 返回对象的引用或者指针
* */
class TDate {
private:
int yy, mm, dd;
public:
TDate(int =2006, int =1, int =1);
TDate& setYear(int);
TDate& setMonth(int);
TDate* setDay(int);
TDate setDate(int ,int, int);
void display();
};
TDate::TDate(int y, int m, int d) {
yy = y;
mm = m;
dd = d;
}
TDate& TDate::setYear(int year) {
yy = year;
return *this;
}
TDate& TDate::setMonth(int month) {
mm = month;
return *this;
}
TDate* TDate::setDay(int day) {
dd = day;
return this;
}
TDate TDate::setDate(int y, int m, int d) {
yy = y;
mm = m;
dd = d;
return *this;
}
void TDate::display() {
printf("address 0x%04x yy=%04d mm=%02d dd=%02d\n", this, yy, mm, dd);
}
int main() {
TDate d1, d2;
// 调用默认构造函数
cout<<"d1 "; d1.display();
cout<<"d2 "; d2.display();
// 返回引用,可以继续调用函数修改成员
d1.setYear(2007).setMonth(3).setDay(30);
cout<<"d1 "; d1.display();
// setDate 返回普通对象,不是d1本身,而是临时对象,既不是指针也不是引用,因此无法设置后续的天数
d1.setDate(2000, 1, 10).setDay(30);
cout<<"d1 "; d1.display();
TDate *p;
p = d1.setDay(21); // 返回 d1对象的指针
cout<<"d1 "; p->display();
TDate d3 = d2.setYear(2006).setMonth(4);
cout<<"d3 "; d3.display();
d1.setYear(2007).setMonth(3) = d3; // 赋值语句
cout<<"d1 "; d1.display();
return 0;
}