class Date{
int y, m, d;
public:
void add_year(int n);
void add_month(int n);
void add_day(int n);
};
对于状态更新函数add_year()、add_month()、add_year()是没有返回值的,对这样一组的相关更新函数,一种很有用的技术是返回已更新对象的引用,这样这些操作就可以串联起来,比如:
void f(Date & d){
d.add_year(1).add_month(1).add_year(1);
}
为此,必须将每个函数都声明为返回一个Date引用:
class Date{
int y, m, d;
public:
Date& add_year(int n);
Date& add_month(int n);
Date& add_day(int n);
};
每个(非static)成员函数都知道是哪个对象调用的它,并能显式引用这个对象。比如:
Date& Date::add_year(int n){
// ....
y += n;
return *this;
}
this的使用大多数是隐式的。特别是,每当我们引用类内的一个非static成员时,都是依赖于一次this隐式使用来获得恰当对象的该成员。比如:
Date& Date::add_year(int n){
// ....
this->y += n;
return *this;
}
this的一种场景的显式应用时用于链表操作,比如:
struct Link{
Link * pre;
Link * suc;
int daya;
Link * insert(){ //在this之前插入x
return pre = new Link{pre, this, x};
}
void remove(){
if(pre){
pre->suc = suc;
}
if(suc){
suc->pre = pre;
}
delete this;
}
...
};
从一个派生类模板访问基类的成员也需要显式使用this