(四) this、const 成员函数与 static 成员
当有多个计数器时,需要区分“修改当前这一个”的状态与“所有对象共享”的统计,再判断哪些操作只是读取。
this 是非静态成员函数中指向当前对象的指针。例如 this->score_ 就表示当前对象的成绩成员。
this 指定操作的是哪一个实例。 counter.add(2) 中,this 指向 counter;return *this 返回当前对象的引用,所以紧接着的 .add(3) 仍在修改同一个对象,最终值为 5。若返回独立副本,后续操作可能只改动副本,链式调用的含义就不同了。
value_ 每个对象各有一份,created_ 则全体对象共享一份。这里的 created_ 只在默认构造函数中增加,没有在析构时减少,因此不是“当前活着的对象数”;编译器生成的拷贝操作也不会执行这个默认构造函数。静态函数没有某个默认的当前对象,所以不能直接读取 value_。
class Counter {
private:
int value_ = 0;
inline static int created_ = 0; // C++17:所有对象共享
public:
Counter() {
++created_;
}
Counter &add(int amount) {
this->value_ += amount;
return *this; // 返回当前对象,便于继续调用
}
int value() const {
return value_;
}
static int created() {
return created_;
}
};调用片段:
Counter counter;
counter.add(2).add(3);
const Counter &view = counter;
// view.value() 为 5;Counter::created() 为已默认构造的对象数const 成员函数承诺不通过该函数修改普通非静态数据成员,可由 const 对象调用。静态成员函数没有 this,不能直接访问某个对象的非静态成员。