C++ / ACM 自学笔记 · v5.0

(四) 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,不能直接访问某个对象的非静态成员。

查阅笔记正文与全部题解 · Ctrl / ⌘ K